1、分治法思想
分:把原问题分解成与原问题相同但比原问题规模更小的子问题,通过递归来实现
治:当子问题规模足够小时直接对子问题进行计算,即到达递归方程的边界条件
并:子问通过向上合并原问题的解,即在递归方程自下而上返回时完成
2、代码实现
#include<iostream>
using namespace std;
int guibing(int list[],int left,int right);
void sort(int list[],int left,int centre,int right);
int main(){
int n;
cout<<"请输入待排序数组元素个数:";
cin>>n;
int a[n];
printf("请输入待排序数组:");
for(int i=0;i<n;i++){
cin>>a[i];
}
guibing(a,0,n-1);
for(int i=0;i<n;i++){
cout<<a[i]<<" ";
}
return 0;
}
int guibing(int list[],int left,int right){
if(right!=left){
int centre;
centre=(right-left)/2+left;
guibing(list,left,centre);
guibing(list,centre+1,right);
sort(list,left,centre,right);
}
else
return 0;
}
void sort(int list[],int left,int centre,int right){
int merge[right-left+1];
int i = left;
int j = centre+1;
int k = 0;
while(right>=j && i<=centre){
if(list[i]>=list[j]){
merge[k]=list[j];
k++;
j++;
}
else{
merge[k]=list[i];
k++;
i++;
}
}
while(i<=centre){
merge[k++] = list[i++];
}
while(j<=right){
merge[k++] = list[j++];
}
for(k=left;k<=right;k++){
list[k] = merge[k-left];
}
}