基于交换的排序、稳定的排序

第一趟:对所有n个元素,从第一个元素开始,比较相邻的两个元素,如果逆序,调换;在第一轮比较完之后,最大(小)的元素就会在最后一个位置

第二趟:对前n-1个元素,从第一个元素开始,比较相邻的两个元素,如果逆序,调换,在第二轮比较完之后,第二大(小)的元素就会在倒数第二位置

……

一共比较n-1趟

    //冒泡排序,从小到大
    public static void bubbleSort(int[] array){
        int length = array.length;
        int temp= 0;
        for(int i=0;i<length-1;i++){//第几趟,一共n-1趟
            for(int j=0;j<length-1-i;j++){//每一趟对前n-i个数进行两两比较
                if(array[j] > array[j+1]){//如果逆序,交换;否则,什么也不做
                    /*temp = array[j];
                    array[j] = array[j+1];
                    array[j+1] = temp;*/
                    array[j] = array[j]^array[j+1];
                    array[j+1] = array[j]^array[j+1];
                    array[j] = array[j]^array[j+1];
                }
            }
            System.out.print(""+i+"趟:");
            listArray(array);
        }
    }

原始数据:49 38 65 97 76 13 27 49
第1趟:38 49 65 76 13 27 49 97
第2趟:38 49 65 13 27 49 76 97
第3趟:38 49 13 27 49 65 76 97
第4趟:38 13 27 49 49 65 76 97
第5趟:13 27 38 49 49 65 76 97
第6趟:13 27 38 49 49 65 76 97
第7趟:13 27 38 49 49 65 76 97

 

改进:

如果某一趟没有交换操作,证明该趟数据已经从小到大排好序了,不用再进行之后的操作

    //冒泡排序,从小到大
    public static void bubbleSort(int[] array){
        int length = array.length;
        int temp= 0;
        
        for(int i=0;i<length-1;i++){//第几趟,一共n-1趟
            boolean flag = false;
            for(int j=0;j<length-1-i;j++){//每一趟对前n-i个数进行两两比较
                if(array[j] > array[j+1]){//如果逆序,交换;否则,什么也不做
                    /*temp = array[j];
                    array[j] = array[j+1];
                    array[j+1] = temp;*/
                    array[j] = array[j]^array[j+1];
                    array[j+1] = array[j]^array[j+1];
                    array[j] = array[j]^array[j+1];
                    flag = true;
                }
            }
            System.out.print(""+(i+1)+"趟:");
            listArray(array);
            //每趟排序完之后,都看看该趟是否有交换操作,如果没有交换操作,证明该趟排序完之后,已经排好序了
            if(flag == false){
                break;
            }
            
        }
    }

原始数据:49 38 65 97 76 13 27 49
第1趟:38 49 65 76 13 27 49 97
第2趟:38 49 65 13 27 49 76 97
第3趟:38 49 13 27 49 65 76 97
第4趟:38 13 27 49 49 65 76 97
第5趟:13 27 38 49 49 65 76 97
第6趟:13 27 38 49 49 65 76 97

 

改进前

平均、最好、最差时间复杂度都是 O(n^2)

改进后

平均、最差O(n^2)   最好O(n)(本来就有序的情况下)