二分归并排序Mergesort
1.问题
对n个不同的数构成的数组A[1…n]进行排序,其中n=2^k
2.解析
归并排序是通过分治divide和归并merge的思想来实现的一种算法。
divide:将n个元素从中间n/2分开,分为[left,n/2]和[n/2+1,right]
merge:通过指针来比较当前两个元素的大小然后移动指针,然后根据排序要求逐个加入到另外的数组中,归并后再赋值给原数组。
3.设计
#include<bits/stdc++.h>
using namespace std;
const int N = 1e3 + 10;
void merge(int f[],int t[],int left,int right) {
int mid = left+right>>1;
int L = left,R = mid+1,st=left;
while (L<=mid && R<=right) {
if (f[L]<=f[R]) {
t[st++] = f[L++];
} else {
t[st++] = f[R++];
}
}
while (L<=mid) t[st++] = f[L++];
while (R<=right) t[st++] = f[R++];
for (int i=left;i<=right;i++) {
f[i] = t[i];
}
}
void sort(int f[],int t[],int left,int right) {
int mid = left+right>>1;
if (left>=right) return;
sort(f,t,left,mid);
sort(f,t,mid+1,right);
merge(f,t,left,right);
}
void MergeSort(int f[],int length) {
int t[N];
sort(f,t,1,length);
}
int main() {
int n,f[N];
cin>>n;
for (int i=1;i<=n;i++) {
cin>>f[i];
}
MergeSort(f,n);
for (int i=1;i<=n;i++) {
cout<<f[i]<<" ";
}
cout<<endl;
}
/*
8
8 7 6 5 4 3 2 1
*/
4.分析
Merge算法比较次数:
- 最坏比较次数为n-1,例如2,4,6,1,3,5比较次数为5次
- 最佳比较次数为n/2,例如1,2,3,4,5,6比较次数为3次
- 算法复杂度:
1.W(n)=2W(n/2)+n-1,n=2^k
2.W(1)=0
综上,W(n)=nlogn+n-1