前言:
分治法归并排序原理:
- 将一个乱序数组分治为两部分,再分别在这两部分再次分治,以此类推,这一步我们可以用循环实现。
- 当然,我们谈到了分治法,分就代表将问题分解为小问题,治就是分别解决这些小问题,最后合并。
图解:
合并原理:
图解:
分析:
从上述的基本思想我们可以大概了解了我们代码的框架,首先我们定义一个归并排序的算法,再定义一个分治的函数即可。
代码:
#include<stdio.h>
#define M 1000
int a[M],b[M];
void merge(int low,int mid,int high){ //定义该函数目的是进行归并排序
int i=low,j=mid+1,k=low;
while(i<=mid&&j<=high){
if(a[i]<a[j]){
b[k++]=a[i++];
}
else{
b[k++]=a[j++];
}
}
while(i<=mid){
b[k++]=a[i++];
}
while(j<=high){
b[k++]=a[j++];
}
for(i=low;i<=high;i++){
a[i]=b[i];
printf("%d ",a[i]);
}
printf("\n");
}
void mergeSort(int a,int b){ //该函数将数组进行分治
if(a<b){
int mid=(a+b)/2;
mergeSort(a,mid);
mergeSort(mid+1,b);
merge(a,mid,b);
}
}
int main(){
int i,n;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
mergeSort(0,n-1);
for(i=0;i<n;i++){
printf("%d ",a[i]);
}
return 0;
}
运行实例:
问题思考:
在理解了该算法后,你会发现最后的结果是从小到大排序。再此,我们就可以编出一个从大到小排序的算法,大家可以去试一下😄
上述代码大家仔细去了解一下应该会看得懂的,当然了这也是小编在学习了其它大佬的博客后才懂的的这个算法,然后小编就分享了自己的学习心得,希望对大家能带来一些帮助,也请大家对我多多支持😃。