内部排序之归并排序

一、基本思想

1、“归并”的含义:将两个或两个以上有序表组合成一个新的有序表。

2、归并排序的基本思想:将待排序的n个记录,看作n个有序的子序列,每个子序列的长度为1。然后两两归并,得到n/2个长度为2或为1的子序列;再两两归并,...,如此重复,直到得到长度为n的子序列为止。这种排序的方法称为2-路归并排序。2-路归并排序的核心操作:将一维数组中前后两个有序序列归并为一个有序序列。在归并过程中,需要一个与原来长度相同的表存放归并结果。

一趟归并排序操作:需调用n/(2h)次算法merge,将SR[1..n]前后相邻且长度为h的有序段两两归并,得到前后相邻、长度为2h的有序段,并放在TR[1..n]中。整个归并排序需要[log2n]趟。如图所示:

3、归并算法的复杂度:

每趟归并的时间复杂度为O(n),整个算法需log2n趟。时间复杂度为O(nlog2n)。归并排序算法虽简单,但占用辅助空间大,实用性差。归并排序是稳定的排序。 

二、算法的C语言描述

三、算法的C语言实现

#include"stdio.h"

#include"stdlib.h"

#define OK 1

#define MAXSIZE 20

typedef intKeyType;

typedef intStatus;

typedef struct

{

KeyType key;

//InfoTypeotherinfo;

}RedType;

typedef struct

{

RedTyper[MAXSIZE+1];

int length;

}Sqlist;

void Merge(RedTypeSR[],RedType TR[],int i,int m,int n)

{

int j,k,l;  

for(j=m+1,k=i;i<=m&&j<=n;++k)

   {

    if(SR[i].key<=SR[j].key) TR[k]=SR[i++];

       else TR[k]=SR[j++];

   }//for

if(i<=m)for(;i<=m;i++) TR[k++]=SR[i];

if(j<=n)for(;j<=n;j++) TR[k++]=SR[j];

}//Merge

void MSort(RedTypeSR[],RedType TR1[],int s,int t)

{

RedTypeTR2[MAXSIZE+1]; 

if(s==t)TR1[s]=SR[s];

else 

    {

       int m=(s+t)/2;      

       MSort(SR,TR2,s,m);

       MSort(SR,TR2,m+1,t);

       Merge(TR2,TR1,s,m,t);

       }//else

}//MSort

voidMergeSort(Sqlist &L)

{

MSort(L.r,L.r,1,L.length);

}

void InputL(Sqlist&L)

{

printf("inputthe length:\n");

scanf("%d",&L.length);

printf("inputthe data needed to sort:\n");

for(inti=1;i<=L.length;i++)

       scanf("%d",&L.r[i].key);

}//InputL

voidOutputL(Sqlist &L)

{

printf("thedata after sorting is:\n");

for(inti=1;i<=L.length;i++)

       printf("%d ",L.r[i].key);

}

int main()

{

Sqlist L;

InputL(L);

MergeSort(L);

OutputL(L);

return OK;

}

发布了278 篇原创文章 · 获赞 31 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/hopegrace/article/details/104510428
今日推荐