归并排序

思路:假设初始序列含有n个记录,可以看成n个有序的子序列,每个子序列的而长度为l,然后把每i(i>=2)个子序列归并,得到n/i个长度为i的有序子序列,再继续归并,如此重复直到得到一个长度为n的有序序列为止。这种排序方法称为i路归并排序。在内部排序中,通常是采用2路归并排序。

程序代码:

  void Merge(Elem temp[],Elem R[],int low,int mid,int high)    //将temp中的两个有序子序列归并到R中

  {

    for(i = low,j = mid+1,k = low;i <= mid && j <= high;k++)

    {

      if(temp[i] < temp[j])

        R[k] = temp[i++];

      else

        R[k] = temp[j++];

    }

    if(i <= mid)

      R[k,---,high] = temp[i,---,mid];

    if(j <= high)

      R[k,---,high] = temp[j,---,high];

  }

  void MSort(Elem R1[],Elem R2[],int low,int high)

  {

    if(low == high)

      R2[low] =R1[low];

    else

    {

      mid = (low+high)/2;

      MSort(R1,temp,low,mid);       //递归的将R1[low,---,mid]归并为有序的temp[low,---,mid]

      MSort(R1,temp,mid+1,high);   //递归的将R1[mid+1,---,high]归并为有序的temp[mid+1,---,high]

      Merge(temp,R1,low,mid,high);  //将temp[low,---,mid]和temp[mid+1,---,high]归并到R1

    }

  }

  void MergeSort(Elem R,int n)

  {

    MSort(R,R,1,n);           //对R[1,---,n]进行2路归并排序

  }

时间复杂度:O(nlogn),即:每一趟归并的时间复杂度为O(n),总共需logn(取上界)趟。

稳定性:稳定。

posted @ 2012-09-13 21:41  毛毛hhmm  阅读(166)  评论(0编辑  收藏  举报