美文网首页
高级排序算法之快速排序

高级排序算法之快速排序

作者: 借缕春风绽百花 | 来源:发表于2020-11-01 13:36 被阅读0次

    排序原理:。

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

    切分原理;

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

    时间复杂度:

    最好情况: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;
               
           }
    

    相关文章

      网友评论

          本文标题:高级排序算法之快速排序

          本文链接:https://www.haomeiwen.com/subject/zhiqvktx.html