目录
一、分治策略
分治法分为三个步骤:
- 分解:将原问题分解为形式相同、规模减小的子问题。
- 解决:通常使用递归或迭代的方法求解。
- 合并:将各个子问题的解合并为原问题的解。
- 归并排序:
- 分解:把数列分成元素个数尽量相等的两个数列。
- 解决:对规模减小的两个数列进行排序。
- 合并:将两个有序序列合并。
图形表示:
代码实现:
void MergeSort(vector<int> &arr,int front,int end)
{
if(front>=end){
return;}
int mid=(front+end)/2;
MergeSort(arr,front,mid);
MergeSort(arr,mid+1,end);
Merge(arr,front,mid,end);
}
void Merge(vector<int> &arr,int front,int mid,int end)
{
int i=front,j=mid+1,k=0;
vector<int> temp(end-front+1);
temp_it=temp.begin();
while(i<=mid && j<=end){
if(arr[i]<=arr[j])
temp[k++]=arr[i++];
else
temp[k++]=arr[j++];
while(i<=mid)
temp[k++]=arr[i++];
while(j<=end)
temp[k++]=arr[j++];
copy(temp.begin,temp.end(),arr.begin()+front);
}
时间复杂度: O(nlogn)