一、分治思想基本概念
将某个难以求解的原问题分成若干个相同规律,且利于求解的子问题,这样分解问题的思想就是分治。分治思想在我们的程序设计中应用的非常广泛。是计算机解决问题的利器。
具体实现:分解问题->治理子问题->将子问题的解合并为原问题的解
如下图:
二、分治思想在排序中的应用
1.快速排序的实现
1.先处理:选中一个元素放到x这个位置,将比a[x]小的元素全部放到左边,不比a[x]小的元素全部放到右边。
2.再分解问题
3.问题的合并:当子问题无法分解也就是只有一个点时,处理结束。因为每个子问题有序,所以原问题必须有序。
如下图:
具体实现代码如下(注意:此代码为从大到小排序):
#include <bits/stdc++.h>
using namespace std;
int a[101];
int Quicksort(int left, int right){
int i,j,t,temp;
if(left>right){
return 0;
}
temp=a[left];
i=left;
j=right;
while(i!=j){
while(a[j]<=temp&&i<j){
j--;
}
while(a[i]>=temp&&i<j){
i++;
}
if(i<j){
t=a[i];
a[i]=a[j];
a[j] = t;
}
}
a[left] = a[i];
a[i] = temp;
Quicksort(left,i-1);
Quicksort(i+1,right);
return 0;
}
int main(){
int i,n;
cin>>n;
for(i=1;i<=n;i++){
cin>>a[i];
}
Quicksort(1,n);
for(i=1;i<n;i++){
cout<<a[i]<<" ";
}
cout<<a[n];
return 0;
}
2.归并排序的实现
思路如下图:
具体实现代码如下:
#include<bits/stdc++.h>
using namespace std;
int a[100010], b[100010];
void mergeSort(int l,int r){
if(l>=r){
return;
}
int mid=(l+r)/2;
mergeSort(l,mid);
mergeSort(mid+1,r);
int i=l;
int j=mid+1;
int k=l;
while(i<=mid&&j<=r){
if(a[i]<=a[j]){
b[k++]=a[i++];
}
else{
b[k++]=a[j ++];
}
}
while(i<=mid){
b[k++]=a[i++];
}
while(j<=r){
b[k++]=a[j++];
}
for(int i=l;i<=r;i++){
a[i]=b[i];
}
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
mergeSort(1,n);
for(int i=1;i<=n;i++){
cout<<a[i]<<" ";
}
return 0;
}
分治算法到这里就结束了。