归并排序
基本思想:
将一个数组按步骤分为若干个不可分的小数组
然后对小数组进行简单的排序
再按照步骤一步步合并各个小数组并且保持有序状态
步骤:
- 1.将数组A[0…n-1] 分成两个相等数组,并分别用数组B和数组C备份
- 2.分别对B,C进行排序
- 3.按照如下方法合并B,C到数组A :
- 重复如下步骤,直到数组中没有元素为止 :
- 比较两个待合并数组的第一个元素
- 将较小的元素添加到一个新创建的数组中,被复制数组中下标后移。
- 在未处理完的数组中,剩下的元素被复制到新创建数组的尾部。
- 重复如下步骤,直到数组中没有元素为止 :
比较直观的图:
资料来源:学校老师的ppt
演示代码:
#include <stdio.h>
void hebing(int a[],int x1,int x2,int x3) //自定义实现一次归并样序的函数
{
int l[50],r[50]; //左右两个数组
int i,j,k;
int long1=x2-x1+1,long2=x3-x2; //左右上界
for( i=0;i<long1;i++){
l[i]=a[x1+i];
}
for( j=0;j<long2;j++){
r[j]=a[x2+j+1];
}
i=0;j=0;
k = x1;
while (i < long1 && j < long2) a[k++] = l[i] < r[j] ? l[i++] : r[j++];
//正常情况
while (i < long1) a[k++] = l[i++];
//左数组没遍历完
while (j < long2) a[k++] = r[j++];
//右数组没遍历完
}
void q(int a[],int op,int ed)//分区算法
{
int mid;
if(op<ed)
{
mid=(op+ed)/2;
q(a,op,mid);
q(a,mid+1,ed);
hebing(a,op,mid,ed);
}
}
int main()
{
int a[100]; //定义一个数组
int n;//数组长度
int i;
scanf("%d",&n);
printf("请输入%d个数:\n",n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]); //从键盘中输入n个数
q(a,1,n); //调用函数进行归并排序
printf("\n排序后的顺序是 :\n");
for(i=1;i<=n;i++)
printf("%6d",a[i]); //输出排好序后的数据
printf("\n");
return 0;
}