C语言实现排序算法之归并排序详解

2020-01-06 12:39:17王振洲


(1)分治法的三个步骤

设归并排序的当前区间是R[low..high],分治法的三个步骤是:

①分解:将当前区间一分为二,即求分裂点:mid = (low+high)/2;
②求解:递归地对两个子区间R[low..mid]和R[mid+1..high]进行归并排序;
③组合:将已排序的两个子区间R[low..mid]和R[mid+1..high]归并为一个有序的区间R[low..high]。

递归的终结条件:子区间长度为1(一个记录自然有序)。

具体算法:


void MSort(int arr[],int low,int high)
{
  if(low < high){
    int mid = (low+high)/2;
    MSort(arr,low,mid);   //左半区排序
    MSort(arr,mid+1,high); //右半区排序
    Merge(arr,low,mid,high);//左右半区合并
  }
}

三:分析

1、稳定性
归并排序是一种稳定的排序。

2、存储结构要求
可用顺序存储结构。也易于在链表上实现。

3、时间复杂度
对长度为n的文件,需进行lgn趟二路归并,每趟归并的时间为O(n),故其时间复杂度无论是在最好情况下还是在最坏情况下均是O(nlgn)。

4、空间复杂度
需要一个辅助向量来暂存两有序子文件归并的结果,故其辅助空间复杂度为O(n),显然它不是就地排序。

注意:
若用单链表做存储结构,很容易给出就地的归并排序。