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

对冒泡排序的改进

通过一趟排序,将待排关键字分为两部分,其中一部分的全部关键字都小于另一部分的全部关键字,然后分别对这两部分进行快速排序,可以选取第一个关键字为基准,将比它小的放在它之前,将比它大的放在它之后,完成这一趟之后,基准所在的位置就将初始序列分成两部分(一部分大、一部分小)

(1)选取序列的第一个关键字为基准base,附设两个指针low、high分别指向关键字序列的第一和最后一个元素

(2)从high位置往前,找到第一个小于base的数,交换

(3)从low位置往后,找到第一个大于base的数,交换

(4)重复(2)(3)直到low==high,完成了第一趟排序,将待排序列分成两部分

(5)分别对这两部分进行快速排序(递归 )

    public static void quickSort(int[] array,int i,int j){
        //i和j记录本次快速排序的区间,由于下一次快速排序的区间需在本次区间的基础上确定,因此,i和j的值需要被记录
        int low = i;
        int high = j;
        int base = array[low];
        if(low<high){
            while(low<high){
                while(low<high && array[high]>=base){
                    high--;
                }
                if(low<high){
                    int temp = array[high];
                    array[high] = array[low];
                    array[low] = temp;
                }
                while(low<high && array[low]<base){
                    low++;
                }
                if(low<high){
                    int temp = array[high];
                    array[high] = array[low];
                    array[low] = temp;
                }
                    
            }
            listArray(array, i, j);
        }else{
            return;
        }

        quickSort(array, i, low-1);
        quickSort(array, high+1, j);
    }

 

注:其实交换是没有必要的,因为基准base最终在low==high那个位置上

    public static void quickSort(int[] array,int i,int j){
        //i和j记录本次快速排序的区间,由于下一次快速排序的区间需在本次区间的基础上确定,因此,i和j的值需要被记录
        int low = i;
        int high = j;
        int base = array[low];
        if(low<high){
            while(low<high){
                while(low<high && array[high]>=base){
                    high--;
                }
                if(low<high){
                    array[low] = array[high];
                }
                while(low<high && array[low]<base){
                    low++;
                }
                if(low<high){
                    array[high] = array[low];
                }
                    
            }
            array[low] = base;
            listArray(array, i, j);
        }else{
            return;
        }

        quickSort(array, i, low-1);
        quickSort(array, high+1, j);
    }

时间复杂度

最好平均O(nlogn) 最坏O(n^2)