交换排序-冒泡排序 + 普通交换排序

冒泡排序算法简介


白哥解释:

        冒泡排序过程:第 n 轮时是将第 n 个数和第 n+1 个数进行比较,如果第 n+1 个数比第 n 个数小,就调换位置;然后拿调换过(或没调换)的第 n+1 个数和第 (n+1)+1 个数继续比较,直到结尾;一共排了 a.length 轮,第 n 轮排序的结果是把最 n 大的数放在倒数第 n 的位置上。

        第 n 轮比较的次数为 a.length-n ,第 n 轮交换的次数为 [ 0 , a.length-n ],共排序 m=a.length 轮

        所以共排序(m)+(m-1)+(m-2)+……+2+1=m(m-1)/2,共交换m(m-1)/2(最多),所以总的时间复杂度为O(m^2)

冒泡排序算法的运作如下:

比较相邻的元素。如果第一个比第二个大,就交换他们两个。

对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

针对所有的元素重复以上的步骤,除了最后一个。

持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较

算法稳定性:  

        冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,我想你是不会再无聊地把他们俩交换一下的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。

大数下沉方式


[6, 5, 2, 7, 1]--将第1个数和第2个数进行比较,如果第1个数比第2个数大,就调换位置

[5, 6, 2, 7, 1]--将第2个数和第3个数进行比较,如果第2个数比第3个数大,就调换位置

[5, 2, 6, 7, 1]--将第3个数和第4个数进行比较,如果第3个数比第4个数大,就调换位置,否则继续

-------将第4个数和第5个数进行比较,如果第4个数比第5个数大,就调换位置

-------进行完一轮比较后,就把最【大】的数(7)放在了最【后】面

[5, 2, 6, 1, 7]--将第1个数和第2个数进行比较,如果第1个数比第2个数大,就调换位置 [2, 5, 6, 1, 7]--将第2个数和第3个数进行比较,如果第2个数比第3个数大,就调换位置,否则继续   -------将第3个数和第4个数进行比较,如果第3个数比第4个数大,就调换位置 -------进行完一轮比较后,就把剩余最大的数(6)放在了最后面
[2, 5, 1, 6, 7]--将第1个数和第2个数进行比较,如果第1个数比第2个数大,就调换位置,否则继续 -------将第2个数和第3个数进行比较,如果第2个数比第3个数大,就调换位置 -------进行完一轮比较后,就把剩余最大的数(5)放在了最后面
[2, 1, 5, 6, 7]--将第1个数和第2个数进行比较,如果第1个数比第2个数大,就调换位置,否则继续 [1, 2, 5, 6, 7]--完成
public class Test {     public static void main(String[] args) {         int[] arr = new int[] { 6, 5, 2, 7, 1 };         System.out.println(Arrays.toString(arr));         bubbleSort(arr);     }     public static void bubbleSort(int[] a) {         for (int i = 0; i < a.length; i++) {             for (int j = 0; j < a.length - i - 1; j++) {                 if (a[j] > a[j + 1]) swap(a, j, j + 1);             }         }     }     public static void bubbleSort2(int[] a) {         for (int i = a.length - 1; i > 0; i--) {//这种形式和上面的是完全一样的,就是把 i 用 a.length-1 的形式变换了一下             for (int j = 0; j < i; j++) {                 if (a[j + 1] < a[j]) swap(a, j, j + 1);             }         }     }     public static void swap(int[] arr, int i, int j) {         if (i == j) return;         int temp = arr[i];         arr[i] = arr[j];         arr[j] = temp;         System.out.println(Arrays.toString(arr));     } }  

小数上浮方式


[6, 5, 2, 7, 1]--将倒数第1个数和倒数第2个数进行比较,如果倒数第1个数比倒数第2个数小,就调换位置

[6, 5, 2, 1, 7]--将倒数第2个数和倒数第3个数进行比较,如果倒数第2个数比倒数第3个数小,就调换位置

[6, 5, 1, 2, 7]--将倒数第3个数和倒数第4个数进行比较,如果倒数第3个数比倒数第4个数小,就调换位置

[6, 1, 5, 2, 7]--将倒数第4个数和倒数第5个数进行比较,如果倒数第4个数比倒数第5个数小,就调换位置

-------进行完一轮比较后,就把最【小】的数(1)放在了最【前】面

[1, 6, 5, 2, 7]--将倒数第1个数和倒数第2个数进行比较,如果倒数第1个数比倒数第2个数小,就调换位置,否则继续 -------将倒数第2个数和倒数第3个数进行比较,如果倒数第2个数比倒数第3个数小,就调换位置 [1, 6, 2, 5, 7]--将倒数第3个数和倒数第4个数进行比较,如果倒数第3个数比倒数第4个数小,就调换位置 -------进行完一轮比较后,就把剩余最小的数(2)放在了最前面
[1, 2, 6, 5, 7]--将倒数第1个数和倒数第2个数进行比较,如果倒数第1个数比倒数第2个数小,就调换位置,否则继续 -------将倒数第2个数和倒数第3个数进行比较,如果倒数第2个数比倒数第3个数小,就调换位置 -------进行完一轮比较后,就把剩余最小的数(5)放在了最前面
[1, 2, 5, 6, 7]--将倒数第1个数和倒数第2个数进行比较,如果倒数第1个数比倒数第2个数小,就调换位置,否则继续 -------完成
public class Test {     public static void main(String[] args) {         int[] arr = new int[] { 6, 5, 2, 7, 1 };         System.out.println(Arrays.toString(arr));         bubbleSort(arr);     }     public static void bubbleSort(int[] a) {         for (int i = 0; i < a.length; i++) {//这里的判断条件严格来说为【i < a.length-1】,不过宽松一点也没关系,因为后面还会做边界判断的             for (int j = a.length - 1; j > i; j--) {//这里的 j 是从尾部开始的                 if (a[j] < a[j - 1]) swap(a, j, j - 1);             }         }     }     public static void bubbleSort2(int[] a) {         for (int i = a.length; i > 0; i--) {             for (int j = a.length - 1; j > a.length - i; j--) {//这种形式和上面的是完全一样的,就是把 i 用 a.length-1 的形式变换了一下                 if (a[j] < a[j - 1]) swap(a, j, j - 1);             }         }     }       public static void swap(int[] arr, int i, int j) {         if (i == j) return;         int temp = arr[i];         arr[i] = arr[j];         arr[j] = temp;         System.out.println(Arrays.toString(arr));     } }

普通交换排序


[6, 5, 2, 7, 1]--将第1个数和第2个数进行比较,如果第1个数比第2个数大,就调换位置

[5, 6, 2, 7, 1]--将第1个数和第3个数进行比较,如果第1个数比第3个数大,就调换位置

[2, 6, 5, 7, 1]--将第1个数和第4个数进行比较,如果第1个数比第4个数大,就调换位置,否则继续

-------进行完一轮比较后,就把最【小】的数(1)放在了最【前】面

[1, 6, 5, 7, 2]--将第2个数和第3个数进行比较,如果第2个数比第3个数大,就调换位置 [1, 5, 6, 7, 2]--将第2个数和第4个数进行比较,如果第2个数比第3个数大,就调换位置,否则继续 -------进行完一轮比较后,就把剩余最小的数(2)放在了最前面
[1, 2, 6, 7, 5]--将第3个数和第4个数进行比较,如果第3个数比第4个数大,就调换位置,否则继续 -------进行完一轮比较后,就把剩余最小的数(5)放在了最前面
[1, 2, 5, 7, 6]--将第4个数和第5个数进行比较,如果第4个数比第5个数大,就调换位置[1, 2, 5, 6, 7]--完成
public class Test {     public static void main(String[] args) {         int[] arr = new int[] { 6, 5, 2, 7, 1 };         System.out.println(Arrays.toString(arr));         bubbleSort(arr);     }     /**      * 缺点是每次找最小值都是单纯的找,而没有为下一次寻找做出铺垫      */       public static void bubbleSort(int[] a) {         for (int i = 0; i < a.length; i++) {//这里的判断条件严格来说为 i < a.length-1,不过宽松一点也没关系,因为后面还会做边界判断的             for (int j = i + 1; j < a.length; j++) {//这里的边界判断才是决定性的                 if (a[i] > a[j]) swap(a, i, j);             }         }     }     public static void swap(int[] arr, int i, int j) {         if (i == j) return;         int temp = arr[i];         arr[i] = arr[j];         arr[j] = temp;         System.out.println(Arrays.toString(arr));     } }

来自为知笔记(Wiz)

时间: 2024-08-06 17:26:34

交换排序-冒泡排序 + 普通交换排序的相关文章

选择法排序/冒泡排序法/交换排序法

这不是个新鲜的话题,是自己之前一直理解错了. int a[10] ={2,4,1,0,9,5,7,6,8,3}; 选择法排序: 第一次循环.a[0] 比较所有的的元素,最小的,跟a0交换 第二次循环,找到剩下的最小的,跟a1 交换 冒泡排序, 也是两层循环 ,  是 1-9, 在内层循环里,是从后往前,这样,一次把最小的一步一步的换到最前来, 比如 a8和a9比较,然后 a7和a8比较,依次.. 说白了,这两种排序,大同小异,时间复杂度是一样的. 交换排序法: 1次循环,跟a0比较,遇到小的,就

八大排序算法之五--交换排序—冒泡排序(Bubble Sort)

基本思想: 在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒.即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换. 算法实现:(HDU 1040 亲测 AC) #include<iostream> using namespace std; const int N =1005; void BubbleSort(int a[],int ); void print(int a[],int num); vo

交换排序—冒泡排序(Bubble Sort)

基本思想: 最简单的排序,也是最耗时间的排序 在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒.即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换. 冒泡排序的示例: 算法的实现: void bubbleSort(int a[], int n){ for(int i =0 ; i< n-1; ++i) { for(int j = 0; j < n-i-1; ++j) { if(a[j] > a

交换排序—冒泡排序(Bubble Sort)算法原理以及Java实现

基本思想: 在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒.即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换. 冒泡排序的示例: 算法实现 1 /** 2 * 3 * @author zhangtao 4 */ 5 public class BubbleSort 6 { 7 public static void main(String[] args) 8 { 9 int arr[]={3,1,5,

交换排序 —— 冒泡排序 + 改进

冒泡排序 冒泡排序是通过无序区相邻两个元素之间进行比较和位置交换,达到排序的目的. 插入排序是设定序列的 1 到 n-1 元素为无序区,初始有序区就只有 0 这个元素,然后将无序区中的元素和有序区中的元素逐个进行比较插入.从而是不断扩大有序区的范围.减少无序区的范围直至排序完成. 而冒泡排序则视整个序列均为无序区.即从 0 到 n-1 这些元素都位于无序区.直接对其中的元素进行比较,根据相邻元素大小比较的结果和想要的最终排序结果,对相邻元素的位置进行调整. 如:想要从小到大的排序结果,那么就对相

交换排序---冒泡排序

1 //冒泡排序 2 /** 3 * 5,8,3,15,14,68,17 4 * 5 * @param arr 6 */ 7 public static void bubbleSort(int[] arr){ 8 //控制比较多少轮 9 for(int i=0;i<arr.length-1;i++){ 10 for(int j=0;j<arr.length-1-i;j++){ 11 if(arr[j]>arr[j+1]){ 12 int temp=arr[j]; 13 arr[j]=ar

交换排序---冒泡排序算法(Javascript版)

比较相邻的元素.如果第一个比第二个大,就交换他们两个.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数.针对所有的元素重复以上的步骤,除了最后一个.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较. function sort(elements){ for(var i=0;i<elements.length-1;i++){ for(var j=0;j<elements.length-i-1;j++){ if(elements[

交换排序_冒泡排序

1. 算法的基本思想 冒泡排序是交换排序的一种.我们可以将数组中的元素想像成一个个气泡.数值大的元素气泡重量大.我们可以自上而下的扫描数组,遇到不符合规则的, 重气泡就往下沉.直到所有的气泡都是轻气泡在上,重气泡在下.这就完成了排序的任务. 2. 算法流程 一开始数组Array[0...n-1]是无序的,我们要对n个元素进行n-1次扫描. 第一次扫描,自上而下的扫描元素,遇到违反规则的两个气泡,就将重气泡下沉(也就是将这两个交换顺序)然后依次比较下去.最后得到的结果就是 最重的气泡被送到了最下面

排序——交换排序

三.交换排序 ①冒泡排序 1.基本思想:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒.即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换. 2.实例 3.java实现 复制代码 package com.sort; //稳定 public class 冒泡排序 { public static void main(String[] args) { int[] a={49,38,65,97,76,13,