算法入门-分治法(合并排序中不使用哨兵)
来源:互联网 发布:ug nx 8.0编程电子书 编辑:程序博客网 时间:2024/06/05 07:01
#include <stdio.h>#include <stdlib.h>/*分治法排序 O(n*lgn)*/#define MAXN 100int a[MAXN];void merge(int p,int q,int r)//原始合并排序算法,适用于任意长度的两个数据段 { int i,j,k; int n1=q-p+1; int n2=r-q; int L[n1+1];//L[1]...L[n]存放n个数 int R[n2+1]; for(i=1;i<=n1;i++) L[i]=a[p+i-1]; for(j=1;j<=n2;j++) R[j]=a[q+j]; i=1;j=1; for(k=p;k<=r;k++) { if(i==n1+1)//L中已经无元素,将R剩余元素复制到a中 { a[k]=R[j]; j++; } else if(j==n2+1)//R中已经无元素,将L剩余元素复制到a中 { a[k]=L[i]; i++; } else { if(L[i]<R[j]) { a[k]=L[i]; i++; } else { a[k]=R[j]; j++; } }}} void merge_sort(int p,int r){ int q; if(p<r) { q=(p+r)/2; merge_sort(p,q); merge_sort(q+1,r); merge(p,q,r); } }int main(int argc, char *argv[]){ int n,i; printf("输入n\n"); scanf("%d",&n); for(i=0;i<n;i++) scanf("%d",&a[i]); merge_sort(0,n-1); printf("分治法排序后\n"); for(i=0;i<n;i++) printf("%d ",a[i]); system("PAUSE"); return 0;}