高级排序算法之快速排序

排序原理:。

①选定一个值作为分界值,将元素分为大于分界值和小于分界值两部分。
②小于分界值数据放在分界值左边,大于分界值数据放在分界值右边。
③将分界值两边的数据重复寻找分界值分组,直到每组只有两个数据并排序。

切分原理;

①选定一个基准值,用两个指针分别指向数组的首部和尾部。
②先从尾部到头部搜索一个比基准值小的数值,搜索到即停止,并记录其索引。
③再从首部到尾部搜索一个比基准值大的数值,搜索到即停止,并记录其索引。
④交换两个指针的元素。
⑤重复搜索,直到左指针的索引大于等于右指针的索引。

时间复杂度:

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

空间复杂度:

O(nlogn)

稳定性:

不稳定

实现:

API设计:

①主排序算法用于排序
public static void sort(int[] a)
②对数组从low到high位置的元素进行排序
private static void localSort(int[] a,int low,int high)
③对数组中从索引low到high处的元素按界限值进行分组,并返回界限值的索引。
public static int partition(int[] a,int low,int high)
④ 比较API,用于比较两个元素大小
private static boolean greater(int[] a,int v,int w)
⑤交换API,用于交换两个索引位置的值
private static void exchange(int[] a,int i,int j)

API实现:

//主排序算法用于排序
       public static void sort(int[] a) {
           int low = 0;
           int high = a.length - 1;
           localSort(a,low,high);
       }
    //对数组从low到high位置的元素进行排序
       private static void localSort(int[] a,int low,int high){
           if(low >= high) {
               return;
           }
           int partition = partition(a,low,high);
           //分别让左右分组进行分组有序
           localSort(a,low,partition-1);
           localSort(a,partition+1,high);
           
       }
    //对数组中从索引low到high处的元素按界限值进行分组,并返回界限值位置变换后的索引。
    public static int partition(int[] a,int low,int high) {
        //1.确定分界值
        int key = a[low];
        //2.设置两个指针分别指向第一个元素和最后一个元素的下一位置
        int left = low;
        int right = high +1;
        
        //切分
        while(true) {
            //先从右向左移动right指针找到一个比key小的数值
            while(!greater(a,--right,key)) {
                if(right == low) break;
            }
            //再从左向右移动left指针找到一个比key大的数值
            while(!greater(a,++left,key)) {
                if(left == high) break;
            }
            if(left >= right){
                break;
            }else {
                exchange(a,left,right);
            }
        }
        //交换分界值位置
        exchange(a,low,right);
        return right;
        
    }
    
     //比较API,用于比较两个元素大小
       private static boolean greater(int[] a,int v,int w) {
           if(a[v]>a[w]) {
               return true;
           }
           return false;
           
       }
       //交换API,用于交换两个索引位置的值
       private static void exchange(int[] a,int i,int j) {
           int temp = a[i];
           a[i] = a[j];
           a[j] = temp;
           
       }

你可能感兴趣的:(高级排序算法之快速排序)