合并排序
#include<stdio.h> #define MAX_INT 65535//哨兵
void Merge(int *a,int p,int q,int r)//关键函数~ 合并 { int L[50],R[50],b[100],i,j,k; int len1=q-p+1; int len2=r-q; for(i=0;i<len1;i++) { L[i] = a[p+i]; } L[len1]=MAX_INT; //L[len1]=600; for(i=0;i<len2;i++) { R[i] = a[q+1+i]; } R[len2] = MAX_INT; //R[len2]=600; i=0;j=0; for(k=0;k<r-p+1;k++) { if(L[i]>R[j]) { b[k]=R[j]; j++; } else { b[k]=L[i]; i++; } } for(i=0;i<r-p+1;i++)//把这个忘了就出错了。。 a[p+i]=b[i]; } void MergeSort(int *a,int p,int q)//递归调用 { int m; if(p<q) { m=(p+q)/2; MergeSort(a,p,m); MergeSort(a,m+1,q); Merge(a,p,m,q); } else return; } int main() { int b[100],n,i; scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d",&b[i]); } MergeSort(b,0,n-1); for(i=0;i<n;i++) { printf("%d ",b[i]); } return 1; }
运行截图:
看着算法导论写的代码,只不过忘了合并排序不是原地排序的,居然每次把排好的结果直接赋值给原数组。。于是出错了~