数据结构之归并排序

归并排序Merging Sort,将两个或两个以上的有序表组合成一个新表。

1.基本思想

假设初始化系列含有n个记录,则可以看出n个有序的子序列,每一个子序列的长为1,然后两两归并,得到【n/2】个长度为1或2的子序列,再两两归并……如此重复,知道最后得到一个长度为n的有序序列位置,这种排序方法称为2-路归并排序

2.归并排序代码

main.cpp

  1 #include <stdio.h>

  2 #include <stdlib.h>

  3 #include <time.h>

  4 #define MAXSIZE 100000000

  5 #define INCREMENTNUM 200000

  6 #define EQ(a,b) ((a)==(b))

  7 typedef struct List{

  8     int*elem;

  9     int length;

 10     int size;

 11 }List;

 12 

 13 void initList(List &list)

 14 {

 15     list.elem=(int*)malloc(sizeof(int)*(MAXSIZE+1));

 16     if(!list.elem){

 17          printf("%s\n","初始化失败");

 18         exit(0);

 19     }

 20     list.length=0;

 21     list.size=MAXSIZE;

 22     printf("%s\n","初始化成功");

 23 }

 24 

 25 void insert(List &list ,int value)

 26 {

 27     if(list.length>=list.size){

 28         list.elem=(int*)realloc(list.elem,sizeof(int)*(list.length+INCREMENTNUM));

 29         if(!list.elem){

 30          printf("%s\n","内存重新分配失败");

 31         exit(0);

 32         }

 33         printf("%s\n","内存重新分配成功");

 34     list.size+=INCREMENTNUM;

 35     }

 36     list.elem[++list.length]=value; //第一从1开始

 37     //printf("%d%s  位置:%d\n",value,"\t插入成功",list.length);

 38 }

 39 

 40 

 41 void printList(List list)

 42 {

 43     //printf("共%d数据\n",list.length);

 44     int i;

 45     for(i=1;i<=list.length;i++){

 46         printf("%d\t",list.elem[i]);

 47     }

 48     printf("\n");

 49 

 50 }

 51 //归并

 52 void Merge(List L1,List &L2,int i,int m,int n)

 53 {

 54     int j;

 55     int k;

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

 57     {

 58         if(L1.elem[i]<L1.elem[j]) L2.elem[k]=L1.elem[i++];

 59         else  L2.elem[k]=L1.elem[j++];

 60     }

 61     if(i<=m)

 62     {

 63         while(i<=m){

 64             L2.elem[k++]=L1.elem[i++];

 65         }

 66     }

 67     if(j<=n)

 68     {

 69         while(j<=n){

 70             L2.elem[k++]=L1.elem[j++];

 71         }

 72     }

 73 }

 74 void MSort(List L1,List &L2,int s,int t)

 75 {

 76     if(s==t) L2.elem=L1.elem;

 77     else

 78     {

 79         List L3;

 80         L3.elem=(int*)malloc(sizeof(int)*(t-s+1));

 81         int m=(s+t)/2;

 82         MSort(L1,L3,s,m);

 83         MSort(L1,L3,m+1,t);

 84         Merge(L3,L2,s,m,t);

 85     }

 86 

 87 }

 88 void MergeSort(List &L)

 89 {

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

 91 }

 92 

 93 

 94 int main()

 95 {

 96 

 97     List list;

 98     initList(list);

 99     insert(list,49);insert(list,38);insert(list,65);insert(list,97);insert(list,76);

100     insert(list,13);insert(list,27);insert(list,49);

101     printList(list);

102     MergeSort(list);

103     printf("排序后\n");

104     printList(list);

105     return 0;

106 }

3.归并排序性能

实现归并排序需要和待排序记录一样的辅助空间O(n),其时间复杂度O(nlogn),通过递归形式的算法在形式上很简洁,但实用性很差,很少利用2路归并排序进行内部排序。

你可能感兴趣的:(数据结构)