分治的典型应用:归并排序
归并排序的主要思路:
- 将前一半排序
- 将后一半排序
- 将排完序的前后合并到tmp数组,再复制回原数组
代码
#include<iostream>
using namespace std;
void Merge (int a[],int s,int m,int e,int tmp[])
//将数组a的局部a[s,m]和a[m+1]有序地合并到tmp
//然后拷贝回a[s,e]
//时间复杂度O(e-m+1) == O(n)
{
int pb = 0;
int p1 = s,p2=m+1;
while(p1 <= m && p2<=e){
if(a[p1]<a[p2])
tmp[pb++] = a[p1++];
else
tmp[pb++] = a[p2++];
}
while(p1<=m){
tmp[pb++] = a[p1++];
}
while(p2<=e){
tmp[pb++] = a[p2++];
}
for(int i=0;i<e-s+1;++i){
a[s+i] = tmp[i];
}
}
void MergeSort(int a[],int s,int e,int tmp[])
{
if(s<e){
int m = s+(e-s)/2;
MergeSort(a,s,m,tmp);
MergeSort(a,m+1,e,tmp);
Merge(a,s,m,e,tmp);
}
}
int a[10] = {13,27,19,2,8,12,2,8,30,89};
int b[10];
int main()
{
int size = sizeof(a)/sizeof(int);
MergeSort(a,0,size-1,b);
for(int i = 0;i<size;i++)
cout << a[i] <<" ";
cout <<endl;
return 0;
}
时间复杂度计算
理解:T(n) = 2T(n/2) + an 前一项为代码中MergeSort函数将耗费的时间,后一项为Merge函数已用用的时间
快速排序
void swap(int & a,int &b){
int tmp = a;
a = b;
b = tmp;
}
void QuickSort(int a[],int p1,int p2){
if(p1>=p2) return;
int p = a[p1];
int i = p1,j = p2;
while(i!=j){
while(j>i&&a[j]>p) j--;
swap(a[i],a[j]);
while(j>i&&a[i]<p) i++;
swap(a[i],a[j]);
}
QuickSort(a,p1,i-1);
QuickSort(a,i+1,p2);
}