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.稳定性分析
稳定排序