提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
在C语言学习中,学会归并排序的使用是必不可少的。今天我将分享我个人的理解。本人还是一枚C语言萌新,如果文章有问题的话,希望大家可以提出建议,非常感谢!
一、归并排序的含义
归并排序是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。归并操作,也叫归并算法,指的是将两个顺序序列合并成一个顺序序列的方法。
二、步骤
1.将数组不断二分
代码如下:
int merge_sort(int r[],int s[],int left,int right)
{
int mid;
int t[100];
if(left==right)
s[left]=r[right];
else
{
mid=(left+right)/2;
merge_sort(r,t,left,mid);
merge_sort(r,t,mid+1,right);
merge(t,s,left,mid,right);
}
return 0;
}
2.逐层向上归并
代码如下:
int merge(int r[],int s[],int left,int mid,int right)
{
int i,j,k;
i=left;
j=mid+1;
k=left;
while((i<=mid)&&(j<=right))
{
if(r[i]<=r[j])
{
s[k] = r[i];
i++;
k++;
}
else
{
s[k]=r[j];
j++;
k++;
}
}
while(i<=mid)
s[k++]=r[i++];
while(j<=right)
s[k++]=r[j++];
return 0;
}
3.主函数
代码如下:
int main()
{
int a[100];
int i,n;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
merge_sort(a,a,0,n-1);
for(i=0;i<n;i++)
printf("%d ",a[i]);
return 0;
}