归并排序

1.算法介绍

  归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。

2.算法原理

  第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
  第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置
  第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
  重复步骤3直到某一指针超出序列尾
  将另一序列剩下的所有元素直接复制到合并序列尾

3.源代码

  

 1 void Merge(int sourceArr[],int tempArr[],int startIndex,int midIndex,int endIndex)
 2 {
 3     int i = startIndex,j=midIndex+1,k = startIndex;
 4     while(i!=midIndex+1 && j!=endIndex+1)
 5     {
 6         if(sourceArr[i]>sourceArr[j])
 7             tempArr[k++] = sourceArr[i++];
 8         else
 9             tempArr[k++] = sourceArr[j++];
10     }
11     while(i!=midIndex+1)
12         tempArr[k++] = sourceArr[i++];
13     while(j!=endIndex+1)
14         tempArr[k++] = sourceArr[j++];
15     for(i=startIndex;i<=endIndex;i++)
16         sourceArr[i] = tempArr[i];
17 }
18  
19 //内部使用递归
20 void MergeSort(int sourceArr[],int tempArr[],int startIndex,int endIndex)
21 {
22     int midIndex;
23     if(startIndex<endIndex)
24     {
25         midIndex=(startIndex+endIndex)/2;
26         MergeSort(sourceArr,tempArr,startIndex,midIndex);
27         MergeSort(sourceArr,tempArr,midIndex+1,endIndex);
28         Merge(sourceArr,tempArr,startIndex,midIndex,endIndex);
29     }
30 }
31  
32 int main(int argc,char * argv[])
33 {
34     int a[8]={50,10,20,30,70,40,80,60};
35     int i,b[8];
36     MergeSort(a,b,0,7);
37     for(i=0;i<8;i++)
38         printf("%d ",a[i]);
39     printf("
");
40     return 0;
41 }

4.算法时间复杂度

  O(nlgn)

5.稳定性分析

  稳定排序

原文地址:https://www.cnblogs.com/pngcui/p/4641416.html