算法入门-分治法(合并排序中不使用哨兵)

来源:互联网 发布: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;}

原创粉丝点击