高级排序算法之归并排序

2020-10-28  本文已影响0人  借缕春风绽百花

排序原理:。

①将待排序元素尽量拆分为元素相等的两个子组,再将子组进行拆分,直到子组元素个数为1为止。
②将相邻两个子组合并为一个有序的大组。
③重复合并,最终只有一个大组。

时间复杂度:

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

空间复杂度:

O(1)

稳定性:

稳定

实现:

API设计:

①主排序算法用于排序
public static void sort(int[] a)
②对数组从low到high位置的元素进行排序
private static void localSort
③将索引low到mid的子组和索引mid+1到索引high的两个子组合并为一个大组。
priavte static void merge(int[] b,int low,int mid,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 mid = low + (high - low)/2;
           
           //递归调用localSort,对每组数据进行排序
           localSort(a,low,mid);
           localSort(a,mid+1,high);
           
           //对数据进行合并
           merge(a,low,mid,high);
       }
       
    //将索引low到mid的子组和索引mid+1到索引high的两个子组合并为一个大组。此时才对比交换来排序
    private static void merge(int[] b,int low,int mid,int high) {
        //定义三个指针,分别指向两个子数组和辅助数组
        int index= low;
        int[] assist = null;
        int p1 = low;
        int p2 = mid + 1;
        //移动子数组指针,将两个指针所在位置的值中较小的值加入辅助数组。
        while(p1<=mid && p2<=high) {
            if(greater(b,p1,p2)) {
                //p1位置元素大于p2位置元素,加入p2
                assist[index ++] = b[p2 ++];
            }else {
                assist[index ++] = b[p1 ++];
            }
        }
        
        //遍历子数组,若一个子数组遍历完成,则将另一个数组剩余元素按顺序追加到辅助数组中。
        while(p1 < mid) {
            assist[index ++] = b[p1 ++];
        }
        while(p2 < high) {
            assist[index ++] = b[p2 ++];
        }
            
        
        //将辅助数组中元素拷贝到合并后大数组中
            for(int position = low; position <= high;position ++) {
                b[position] = assist[position];
            }
    }
     //比较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;
           
       }
上一篇下一篇

猜你喜欢

热点阅读