题目
使用二分归并排序,对n个不同的数构成的数组A[1…n]进行排序,其中n=2^k。
解析
该算法分为两部分:
Merge_Sort(int *a, int *temp,int start,int mid,int end)d)
Sort(int *a, int *temp,int start,int end)
设计
核心代码:
void Merge_Sort(int *a, int *temp,int start,int mid,int end){ //归并排序
int left_start=start; //数组前一半的起点
int left_end=mid; //数组前一半的终点
int right_start=mid+1; //数组后一半的起点
int right_end=end; //数组后一半的终点
int i=start; //指向数组起点
while(left_start<=left_end&&right_start<=right_end){ //当数组左右两端都还没遍历完则进行以下操作
if(a[left_start]>a[right_start])//数组前一半的起点与后一半的起点做比较,把值小的记录在新数组中
temp[i++]=a[right_start++];
else
temp[i++]=a[left_start++];
}
while(left_start<=left_end) //左剩
temp[i++]=a[left_start++];
while(right_start<=right_end) //右剩
temp[i++]=a[right_start++];
for(i=start;i<=end;i++)
a[i]=temp[i]; //把排好序的数组赋给a数组
}
void Sort(int *a, int *temp,int start,int end){ //把数组对半分开通过递归来排序
if(start<end){
int mid=(start+end)/2; //找到中点
Sort(a,temp,start,mid); //前一半排序
Sort(a,temp,mid+1,end); //后一半排序
Merge_Sort(a,temp,start,mid,end); //归并排序
}
}
分析
Merge_Sort算法最坏比较n-1次,最佳比较n/2次。
算法复杂度:
W(n)=2W(n/2)+n-1,n=2^k
W(1)=0
综上:W(n)=nlogn-n+1
所以是O(nlogn)
GitHub源码在这里
不足之处还望指正:)