合并排序(递归)

来源:互联网 发布:淘宝搜索引擎工作流程 编辑:程序博客网 时间:2024/05/18 01:52

合并排序,也称为归并排序算法(Merge Sort)。采用分而治之的方法,将一组数据拆分成左右部分,迭代拆分直到每个部分只有 一个元素。然后将左右部分迭代合并成一个序列。是速度仅次于快速排序的常用排序方法,是一种稳定的排序方法(即相同元素的顺序是不会改变的)。时间复杂度O(nlogn)。

这里写图片描述

拆分部分可以用递归函数实现。重点在于合并两个子序列为一个序列(假设是升幂排列):
(1)为两个子序列申请内存空间;
(2) 从左右序列的第一个元素开始比较,如果aux[left]<=aux[right],则将aux[left]放进合并序列arr[k],且下标k++;相反则将aux[right]放进arr[k++];
(3)如果左右序列有一个已经遍历完了,就把另一个序列的剩下的元素全部放进合并序列arr就行了。
《《注意:合并序列arr与辅助序列aux直接的元素对应关系。》》

void Merge(int arr[], int start, int mid, int end){   int aux[end+1], left, right;   if(arr==NULL || start>=end)    return;   //copy elments from arr to aux, arr is the result arr   for(int i=start; i<=end; i++)        aux[i]=arr[i];    left=start;    right=mid+1;   //merge the left group, right group of aux into arr   for(int k=start; k<=end; k++)   {//get an element one time     //one side ends, put the rest of other side to arr     if(left>mid) //left ends, put the rest of right to arr    arr[k]=aux[right++];     else if(right>end)//right ends, put the rest of left to arr    arr[k]=aux[left++];      if(left<=mid && right<=end)//both sides not end    if(aux[left]<= aux[right])       arr[k] = aux[left++];    else       arr[k]=aux[right++];   } }void MergeSort(int arr[], int start, int end){    if(arr==NULL || start>=end)    return;    //Divide into two parts    int mid=start+(end-start)/2;    MergeSort(arr,start, mid);    MergeSort(arr,mid+1,end);    //Merge two parts into one    Merge(arr,start,mid,end);}
0 0