归并排序是基于归并操作的排序算法。归并排序是对分治思想的典型应用。
归并排序说起来很简单:先将数据分开排序,然后再合并起来,最后形成一个排好的序列。
合并操作:比较a[i]和b[j],如果a[i]<=b[j],令r[k]=a[i],然后k和i分别加1,如果a[i]>b[j],令r[k]=b[j],然后令k和j分别加1。直到两个数组中某个数组的全部元素都复制到数组r中。然后将另一个数组的剩余元素全部复制到数组r中。
具体代码如下:
//--------------------
// 归并排序
//--------------------
#include<cstdio>
#define size 9
int a[size]={9,2,4,3,6,8,7,5,1};
int b[9];
int kase=0;
void print()
{
for(int i=0;i<size;i++)
printf(" %d",a[i]);
printf("\n");
}
void merge(int* array,int* array2,int left,int mid,int right)
{
int i=left,j=mid+1,k=0;
while(i<=mid&&j<=right)
{
if(array[i]<=array[j])
array2[k++]=array[i++];
else
array2[k++]=array[j++];
}
while(i<=mid)
{
array2[k++]=array[i++];
}
while(j<=right)
{
array2[k++]=array[j++];
}
for(i=left,k=0;i<=right;)
array[i++]=array2[k++];
printf("第%d次归并排序:",++kase);
for(i=left;i<=right;i++)
printf(" %d",array[i]);
printf("\n");
}
void merge_sort(int* array,int* array2,int left,int right)
{
if(left>=right)
{
return;
}
int mid=(right+left)/2;
merge_sort(array,array2,left,mid);
merge_sort(array,array2,mid+1,right);
merge(array,array2,left,mid,right);
}
int main()
{
printf("排序前的数组:");
print();
merge_sort(a,b,0,8);
printf("执行归并排序后的数组:");
print();
return 0;
}
代码运行结果如下: