归并排序算法

1、算法思想

分治法 自顶而下实现归并排序:

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

①分解:将当前区间一分为二,即求分裂点
                 
 

②求解:递归地对两个子区间R[low..mid]和R[mid+1..high]进行归并排序;
③组合:将已排序的两个子区间R[low..mid]和R[mid+1..high]归并为一个有序的区间R[low..high]。
  递归的终结条件:low==high


2、算法分析

(1)稳定性

 归并排序是一种稳定的排序。

(2)存储结构

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

(3)时间复杂度

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

(4)空间复杂度

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

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

我的C版本code:

 

 

#include <stdio.h>
#include <stdlib.h>

int num;

void Merge(int r[],int d[], int low,int mid,int high)
{
 int i = low;
 int j = mid + 1;
 int k = low;
 
 while(i <= mid && j <= high)
 {
  if(r[i] <= r[j]) d[k++] = r[i++];
  else d[k++] = r[j++];
 }
 while(i <= mid)
 {
  d[k++] = r[i++];
 }
 while(j <= high)
 {
  d[k++] = r[j++];
 } 

 for(int m=0;m<num;m++)
 {
  r[m] = d[m];
 }
}

void MergeSort(int r[],int d[],int low,int high)
{
 if(low == high) d[low] = r[low];
 else
 {
  int mid = (low + high)/2;
  MergeSort(r,d,low,mid);
  MergeSort(r,d,mid+1,high);
  Merge(d,r,low,mid,high);
 } 
}

int main()
{

 printf("Input the waiting to MergeSort sequence's MAX_SIZE:\n");
 scanf("%d",&num);

 int r[num],i=0;
 int *d = (int*)malloc(num*sizeof(int));

 printf("Input the %d Integer_elements of the sequence:\n",num);
 for(i=0;i<num;i++){ 
  scanf("%d",&r[i]);
 }
 MergeSort(r,d,0,num-1);
 printf("After sorted:\n");
 for(i=0;i<num;i++)
 {
  printf(" %d",d[i]);  
 }
 printf("\n");
 free(d);

 return 0; 
}

 运行结果演示:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章