排序算法之--归并排序

240 阅读2分钟

归并排序

归并排序是采用的分而治之的递归方式来完成数据排序的,主要是将已有序的两个子序列,合并成一个新的有序子序列。先将子序列分段有序,然后再将分段后的子序列合并成,最终完成数据的排序。

主要步骤:

  • 将数据的长度从中间一分为二,分成两个子序列,执行递归操作,直到每个子序列就剩两个元素
  • 然后分别对这些拆好的子序列进行归并排序。
  • 将排序好的子序列再两两合并,最终合并成一个完整的排序序列。

d17e175cdb79449d9207896ea51ed3f6_tplv-k3u1fbpfcp-watermark.png

归并过程:

image.png

  • 设置两个数组分别装载左,右边排序好的数据
  • 设置两个变量(快慢指针)分别指向左右数组的起始位置
  • 设置一个变量指向原始数组的位置,比较左右两个数组数据的大小,小的按顺序存放在原始数组中
public static void mergeSort(int array[],int left,int right){
        if(left==right){
            return;
        }else{
            int mid=(left+right)/2;
            mergeSort(array,left,mid);
            mergeSort(array,mid+1,right);
            merge(array,left,mid+1,right);
        }
    }
    
 public static void merge(int[] array,int left,int mid,int right){
        int leftSize=mid-left;
        int rightSize=right-mid+1;
        //生成数组
        int[] leftArray=new int[leftSize];
        int[] rightArray=new int[rightSize];
        //填充数据
        for(int i=left;i<mid;i++){
            leftArray[i-left]=array[i];
        }
        for(int i=mid;i<=right;i++){
            rightArray[i-mid]=array[i];
        }
        //合并
        int i=0;
        int j=0;
        int k=left;
        while(i<leftSize && j<rightSize){
            if(leftArray[i]<rightArray[j]){
                array[k]=leftArray[i];
                k++;i++;
            }else{
                array[k]=rightArray[j];
                k++;j++;
            }
        }
        while(i<leftSize){
            array[k]=leftArray[i];
            k++;i++;
        }
        while(j<rightSize){
            array[k]=rightArray[j];
            k++;j++;
        }
    }

应用场景

应用场景 数据量大并且有很多重复数据,链式结构 短处 需要空间大

时间复杂度:o(n)=nlogn