MergeSort归并排序

来源:互联网 发布:java 设备数据对接 编辑:程序博客网 时间:2024/05/04 19:55

MergeSort

描述:MergeSort ( a , b)

                       MergeSort ( a, ( a + b ) / 2 );        // 把问题分为两部分,先对数列的前一半进行排序,然后对后一半排序

                       MergeSort  ( a + b ) / 2 , b ); 

                       Merge ( a, ( a + b ) / 2 , b );         //合并两个已排序的数列

一直递归到子序列中只有一个数。

#include<stdio.h>int a[1000];void merge(int x,int mid,int y)   //是用插入排序的方式来归并两个子序列{int i,j,k;int b[1000];for(i=x,j=mid+1,k=0;i<=mid&&j<=y;k++){if(a[i]>a[j])b[k]=a[i++];elseb[k]=a[j++];}/*退出循环时,i>mid或j>y*/if(i>mid)          //当i==mid或j==y 时,还需进行操作,此时a[mid]或a[y]中的值还未放到b[]中!!!{for(;j<=y;j++,k++)b[k]=a[j];}else{for(;i<=mid;i++,k++)b[k]=a[i];}for(i=x,k=0;i<=y;i++,k++)a[i]=b[k];}void mergesort(int x,int y)/*比较有意思的地方,通常要传入数组我都是写 a[n],其实也可以只写数组名,以指针的方式传入*/{int t,k;int i,j;if(x<y) //此处要注意啦!!!这是递归的条件,最初写的程序里没有这个条件,结果无限除2,死循环直到栈溢出……!!{mergesort(x,(x+y)/2);mergesort((x+y)/2+1,y);merge(x,(x+y)/2,y);}}int main(){int n,i;scanf("%d",&n);for(i=0;i<n;i++)scanf("%d",&a[i]);mergesort(0,n-1);for(i=0;i<n-1;i++)printf("%d ",a[i]);printf("%d\n",a[i]);return 0;}



原创粉丝点击