C/C++各种排序法

来源:互联网 发布:max384灯控台编程教程 编辑:程序博客网 时间:2024/06/07 10:11
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. struct node
  4. {
  5.     int key;
  6. }r[20];
  7. struct rnode
  8. {
  9.     int key;
  10.     int point;
  11. };
  12. main()
  13. {
  14.     void print(struct node a[20],int n);
  15.     int creat();
  16.     void shell(struct node a[20],int n);
  17.     int hoare(struct node a[20],int l,int h);
  18.     void quick1(struct node a[20],int n);
  19.     void quick2(struct node a[20],int l,int h);
  20.     void heap(struct node a[20],int i,int m);
  21.     void heapsort(struct node a[20],int n);
  22.     void merges(struct node a[20],struct node a2[20],int h1,int mid,int h2);
  23.     void mergepass(struct node a[20],struct node a2[20],int l,int n);
  24.     void mergesort(struct node a[20],int n);
  25.     int yx(int m,int i);
  26.     int radixsort(struct rnode a[20],int n);
  27.     int num,l,h,c;
  28.     struct rnode s[20];
  29.     c=1;
  30.     while(c!=0)
  31.     {
  32.         printf("        主菜单                       /n");
  33.         printf("   1    输入关键字,以-9999表示结束。/n");
  34.         printf("   2    希尔排序                     /n");
  35.         printf("   3    非递归的快速排序             /n");
  36.         printf("   4    递归的快速排序               /n");
  37.         printf("   5    堆排序                       /n");
  38.         printf("   6    归并排序                     /n");
  39.         printf("   7    基数排序                     /n");
  40.         printf(" 输入选择    (1--7,0表示结束):         ");
  41.         scanf("%d",&c);
  42.         switch(c)
  43.         {
  44.         case 1:num=creat();print(r,num);break;
  45.         case 2:shell(r,num);print(r,num);break;
  46.         case 3:quick1(r,num);print(r,num);break;
  47.         case 4:l=0;h=num-1;quick2(r,l,h);
  48.             printf("output quick2sort result:/n");
  49.             print(r,num);break;
  50.         case 5:heapsort(r,num);break;
  51.         case 6:mergesort(r,num);print(r,num);break;
  52.         case 7:radixsort(s,num);
  53.         }
  54.     }
  55. }//main end
  56. void print(struct node a[20],int n)
  57. {
  58.     int i;
  59.     for(i=0;i<n;i++)
  60.         printf("%5d",a[i ].key);
  61.     printf("/n");
  62. }//print end
  63. int creat()
  64. {
  65.     int i,n;
  66.     n=0;
  67.     printf("input keys");
  68.     scanf("%d",&i);
  69.     while(i!=-9999)
  70.     {
  71.         r[n].key=i;
  72.         n++;
  73.         scanf("%d",&i);
  74.     }
  75.     return(n);
  76. }//creat end
  77. void shell(struct node a[20],int n)//希尔排序
  78. {
  79.     int i,j,k;
  80.     for(i=n;i>=1;i--)
  81.         a[i].key=a[i-1].key;
  82.     k=n/2;
  83.     while(k>=1)
  84.     {
  85.         for(i=k+1;i<=n;i++)
  86.         {
  87.             a[0].key=a[i].key;
  88.             j=i-k;
  89.             while((a[j].key>a[0].key)&&(j>=0))
  90.             {
  91.                 a[j+k].key=a[j].key;
  92.                 j=j-k;
  93.             }
  94.             a[j+k]=a[0];
  95.         }
  96.         k=k/2;
  97.     }
  98.     for(i=0;i<n;i++)
  99.         a[i].key=a[i+1].key;
  100.     printf("输出希尔排序的结果:/n");
  101. }//shell end
  102. ////////////////////快速排序///////////////////////////
  103. int hoare(struct node a[20],int l,int h)//分区处理函数
  104. {
  105.     int i,j;
  106.     struct node x;
  107.     i=l;
  108.     j=h;
  109.     x.key=a[i].key;
  110.     do
  111.     {
  112.         while((i<j)&&(a[j].key>=x.key))
  113.             j--;
  114.         if(i<j)
  115.         {
  116.             a[i].key=a[j].key;
  117.             i++;
  118.         }
  119.         while((i<j)&&(a[i].key<=x.key))
  120.             i++;
  121.         if(i<j)
  122.         {
  123.             a[j].key=a[i].key;
  124.             j--;
  125.         }
  126.     }while(i<j);
  127.     a[i].key=x.key;
  128.     return(i);
  129. }//hoare end
  130. void quick1(struct node a[20],int n)
  131. {
  132.     int i,l,h,tag,top;
  133.     int s[20][2];
  134.     l=0;h=n-1;tag=1;top=0;
  135.     do
  136.     {
  137.         while(l<h)
  138.         {
  139.             i=hoare(a,l,h);
  140.             top++;
  141.             s[top][0]=i+1;
  142.             s[top][1]=h;
  143.             h=h-1;
  144.         }
  145.         if(top==0)
  146.             tag=0;
  147.         else
  148.         {
  149.             l=s[top][0];
  150.             h=s[top][1];
  151.             top--;
  152.         }
  153.     }while(tag==1);
  154.     printf("输出非递归快速排序结果:/n");
  155. }//quick end
  156. void quick2(struct node a[20],int l,int h)//递归的快速排序
  157. {
  158.     int i;
  159.     if(l<h)
  160.     {
  161.         i=hoare(a,l,h);
  162.         quick2(a,l,i-1);
  163.         quick2(a,i+1,h);
  164.     }
  165. }//quick2 end
  166. ////////////////////快速排序结束////////////////////////
  167. ////////////////////堆排序函数//////////////////////////
  168. void heap(struct node a[20],int i,int m)//调整堆的函数
  169. {
  170.     struct node x;
  171.     int j;
  172.     x.key=a[i].key;
  173.     j=2*i;
  174.     while(j<=m)
  175.     {
  176.         if(j<m)
  177.             if(a[j].key>a[j+1].key)
  178.                 j++;
  179.         if(a[j].key<x.key)
  180.         {
  181.             a[i].key=a[j].key;
  182.             i=j;
  183.             j=2*i;
  184.         }
  185.         else
  186.             j=m+1;
  187.     }
  188.     a[i].key=x.key;
  189. }//heap end
  190. void heapsort(struct node a[20],int n)//堆排序的主体函数
  191. {
  192.     int i,v;
  193.     struct node x;
  194.     for(i=n;i>0;i--)
  195.         a[i].key=a[i-1].key;
  196.     for(i=n/2;i>=1;i--)
  197.         heap(a,i,n);
  198.     printf("输出堆排序结果:/n");
  199.     for(v=n;v>=2;v--)
  200.     {
  201.         printf("%5d",a[1].key);
  202.         x.key=a[1].key;
  203.         a[1].key=a[v].key;
  204.         a[v].key=x.key;
  205.         heap(a,1,v-1);
  206.     }
  207.     printf("%5d",a[1].key);
  208.     for(i=0;i<n;i++)
  209.         a[i].key=a[i+1].key;
  210. }//heapsort end
  211. /////////////////堆排序函数结束///////////////////
  212. //////////////////归并函数////////////////////////
  213. void merges(struct node a[20],struct node a2[20],int h1,int mid,int h2)
  214. //归并排序的核心算法
  215. {
  216.     int i,j,k;
  217.     i=h1;j=mid+1;k=h1-1;
  218.     while((i<=mid)&&(j<=h2))
  219.     {
  220.         k=k+1;
  221.         if(a[i].key<=a[j].key)
  222.         {
  223.             a2[k].key=a[i].key;
  224.             i++;
  225.         }
  226.         else
  227.         {
  228.             a2[k].key=a[j].key;
  229.             j++;
  230.         }
  231.     }
  232.     while(i<=mid)
  233.     {
  234.         k++;
  235.         a2[k].key=a[i].key;
  236.         i++;
  237.     }
  238.     while(j<=h2)
  239.     {
  240.         k++;
  241.         a2[k].key=a[j].key;
  242.         i++;
  243.     }
  244. }//merges end
  245. void mergepass(struct node a[20],struct node a2[20],int l,int n)
  246. //一趟归并
  247. {
  248.     int j,i,h1,mid,h2;
  249.     i=0;
  250.     while((n-i)>=2*l)
  251.     {
  252.         h1=i;
  253.         mid=h1+l-1;
  254.         h2=i+2*l-1;
  255.         merges(a,a2,h1,mid,h2);
  256.         i=i+2*l;
  257.     }
  258.     if((n-i)<=l)
  259.         for(j=i;j<=n;j++)
  260.             a2[j].key=a[j].key;
  261.     else
  262.     {
  263.         h1=i;
  264.         mid=h1+l-1;
  265.         h2=n-1;
  266.         merges(a,a2,h1,mid,h2);
  267.     }
  268. }//mergepass end
  269. void mergesort(struct node a[20],int n)
  270. {
  271.     int l;
  272.     struct node a2[20];
  273.     l=1;
  274.     while(l<n)
  275.     {
  276.         mergepass(a,a2,l,n);
  277.         l=2*l;
  278.         mergepass(a2,a,l,n);
  279.         l=2*l;
  280.     }
  281.     printf("输出归并排序的结果:/n");
  282. }//mergesort end
  283. ///////////////归并函数结束///////////////
  284. ///////////////基数排序///////////////////
  285. int yx(int m,int i)//分离关键字倒数第i位有效数字的算法
  286. {
  287.     int x;
  288.     switch(i)
  289.     {
  290.     case 1:x=m%10;break;
  291.     case 2:x=(m%100)/10;break;
  292.     case 3:x=(m%1000)/100;break;
  293.     case 4:x=(m%10000)/1000;break;
  294.     }
  295.     return(x);
  296. }//yx end
  297. int radixsort(struct rnode a[20],int n)
  298. {
  299.     int f[11],e[11],i,j,k,l,p,d,t;
  300.     for(i=1;i<=n;i++)
  301.     {
  302.         a[i].key=r[i-1].key;
  303.         a[i].point=i+1;
  304.     }
  305.     a[n].point=0;
  306.     p=1;
  307.     printf("输出关键字有效位数 d/n");
  308.     scanf("%d",&d);
  309.     printf("输出基数排序的结果:/n");
  310.     for(i=1;i<=d;i++)
  311.     {
  312.         for(j=0;j<=10;j++)
  313.         {
  314.             f[j]=0;
  315.             e[j]=0;
  316.         }
  317.         while(p!=0)
  318.         {
  319.             k=yx(a[p].key,i);
  320.             if(f[k]==0)
  321.             {
  322.                 f[k]=p;
  323.                 e[k]=p;
  324.             }
  325.             else
  326.             {
  327.                 l=e[k];
  328.                 a[l].point=p;
  329.                 e[k]=p;
  330.             }
  331.             p=a[p].point;
  332.         }
  333.         j=0;
  334.         while(f[j]==0)
  335.             j++;
  336.         p=f[j];t=e[j];
  337.         while(j<10)
  338.         {
  339.             j++;
  340.             while((j<10)&&(f[j]==0))
  341.                 j++;
  342.             if(f[j]!=0)
  343.             {
  344.                 a[t].point=f[j];
  345.                 t=e[j];
  346.             }
  347.         }
  348.         a[t].point=0;
  349.         t=p;
  350.         while(t!=0)
  351.         {
  352.             printf("%5d",a[t].key);
  353.             t=a[t].point;
  354.         }
  355.         printf("/n");
  356.     }
  357.     return(p);
  358. }

<script type="text/javascript"><!--google_ad_client = "pub-3555979289815451";google_ad_slot = "0437120238";google_ad_width = 468;google_ad_height = 60;//--></script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script>
原创粉丝点击