归并排序 merge sort

来源:互联网 发布:淘宝手机端店铺装修图 编辑:程序博客网 时间:2024/06/03 16:16

归并排序是基于归并操作的排序算法。归并排序是对分治思想的典型应用。

归并排序说起来很简单:先将数据分开排序,然后再合并起来,最后形成一个排好的序列。

合并操作:比较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 9int 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++];elsearray2[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;}
代码运行结果如下: