分治算法
典型应用:归并排序
数组排序任务可以如下完成
1)把前一半排序
2)把后一半排序
3)把两半归并到一个新的有序数组,然后再拷贝回原数组,排序完成。
Mergesort(a, 0, size-1, b);--->归并排序可以选择只排序[0,size-1]这段数组,a为要排序数组,b为中转。
Merge(a, 0, middle,size-1, b) ;--->将两个数组归并起来
#include<bits/stdc++>
using namespace std;
int a[10];
int b[10];
void Mergesort(int a[], int s, int e,int tmp[]);//将一个数组进行排序
void Merge(int a, int s, int m,int e, int tmp[]);//将两个排好序的数组进行归并
int main()
{
for(int i=0;i<10;i++)
cin>>a[i];
Mergesort(a, 0, 10, b);
for(int i=;i<10;i++)
cout<<a[i]<<" ";
cout<<endl;
return 0;
}
void Mergesort(int a[], int s, int e,int tmp[]) //将前一半进行归并排序,后一半进行归并排序,将排好序的两半merge
{
if(s < e){ //s=e意味着只有一个元素,此时不需要进行排序,直接return
int m= (s+e)/2;
Mergesort(a, s, m, tmp) ;
Mergesort(a, m+1, e, tmp) ;
Merge(a , s, m , e, tmp) ;
}
void Merge(int a, int s, int m,int e, int tmp[])
{
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中
tmp[pb++] = a[p1++];
while(p2 <= e)
tmp[pb++] = a[p2++];
for(int i=0; i < e-s+1 ;i++)//将tmp中排好序的元素,copy给a
a[s+i] = tmp[i];
}