Chinaunix首页 | 论坛 | 博客
  • 博客访问: 625328
  • 博文数量: 262
  • 博客积分: 8433
  • 博客等级: 中将
  • 技术积分: 2141
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-31 09:37
文章分类

全部博文(262)

文章存档

2012年(1)

2011年(168)

2010年(92)

2009年(1)

分类: C/C++

2011-01-28 10:58:18

  1. /*
  2.  *排序算法练习
  3.  */

  4. #include <iostream>    //注意C++头文件格式


  5. #define OK 0
  6. #define ERR -1

  7. typedef int ElemType;
  8. typedef int Status;

  9. using namespace std;    //运用空间的书写格式


  10. Status InsertSort(ElemType* r,int len)
  11. {
  12.     int i=0,j=0;

  13.     for(i=2;i<=len;i++)    //要进行len-1次比较

  14.     {
  15.         if(r[i]<r[i-1])
  16.         {
  17.             r[0] = r[i];
  18.             r[i] = r[i-1];    //有序数列最后一个元素后移,这是因为他已经和a[0]比较过了;流出空位,为a[0]插入做准备


  19.             for(j=i-2;r[0]<r[j]&&j>0;j--)    //和哨兵r[0]相比较,大,则后移位

  20.             {
  21.                 r[j+1]=r[j];    //有序数列向后移位

  22.             }
  23.             r[j+1]=r[0];
  24.         }

  25.     }

  26.     return OK;
  27. }

  28. Status BubbleSort(ElemType* a,int len)
  29. {
  30.     ElemType tmp;    //用于交换数据

  31.     int i,j;

  32.     for(i=0;i<len;i++)    //一共要冒泡len次

  33.     {
  34.         for(j=1;j<len-i;j++)    //每次冒泡要比较len-i-1次,书上有错误,注意数组下标的范围

  35.         {
  36.             if(a[j-1]>a[j])
  37.             {
  38.                 tmp = a[j];
  39.                 a[j] = a[j-1];
  40.                 a[j-1] = tmp;
  41.             }
  42.         }
  43.     }

  44.     return OK;
  45. }

  46. //对数组进行分区操作,返回分区点

  47. int Patition(ElemType* r,int low,int high)
  48. {
  49.     r[0] = r[low];    //保护r[low]

  50.     int pivotpos;
  51.     ElemType pivotkey;
  52.     pivotkey = r[low]; //将第一个元素作为轴点,保存到轴点中


  53.     //开始分区

  54.     while(low<high)
  55.     {
  56.         //取出高位上小于轴点的数

  57.         while(r[high]>=pivotkey && low<high)
  58.         {
  59.             high--;
  60.         }
  61.         r[low] = r[high];    //高位小元素放到地位轴点位置


  62.         //取出地位

  63.         while(r[low]<=pivotkey && low<high)
  64.         {
  65.             low++;
  66.         }
  67.         r[high] = r[low];    //地位大元素放到高位轴点位置

  68.     }
  69.     r[low] = r[0];        //保护数据放入合适的位置


  70.     pivotpos = low;    //找到了分区点


  71.     return pivotpos;
  72. }

  73. //快速排序法

  74. Status QuickSort(ElemType* r,int low,int high)
  75. {
  76.     int pos;    //定义曲轴位置

  77.      if(low<high)    //递归限制条件

  78.     {
  79.         pos = Patition(r,low,high);
  80.     
  81.         QuickSort(r,low,pos-1);    //低数区递归


  82.         QuickSort(r,pos+1,high);    //高数区递归

  83.     }

  84.     return OK;
  85. }

  86. Status ShellSort(ElemType* r,int len)
  87. {
  88.     int i,j,dk;

  89.     for(dk=len/2;dk>0;dk--)    //增量递减

  90.     {
  91.         for(i=dk+1;i<=len;i++)
  92.         {
  93.             //进行一次插入法排序

  94.             if(r[i]<r[i-dk])
  95.             {
  96.                 r[0]=r[i];    //暂存r[i]

  97.                 //r[i]=r[i-dk];    //后移


  98.                 for(j=i-dk;r[0]<r[j] && j>0;j-=dk)
  99.                 {
  100.                     r[j+dk]=r[j];
  101.                 }
  102.                 r[j+dk] = r[0];
  103.             }
  104.         }
  105.     
  106.     }
  107.     
  108.     return OK;
  109. }

  110. void main()
  111. {
  112.     int i=0,j=0,len=0;
  113.     ElemType a[20],r[21],tmp;

  114.     cout<<"请输入要排序的数:(CTRL+Z ENTER结束)"<<endl;
  115.     while(scanf("%d",&tmp) != EOF)    
  116.     {
  117.         a[i] = tmp;
  118.         printf("Input data: %d \n",a[i]);    //scanf和printf对应使用

  119.         r[i+1] = a[i];    //创建头空数组,为插入排序,快速排序做准备;r[0]作为辅助单元

  120.         
  121.         i++;
  122.         len++;
  123.     }
  124. //    len-=1;


  125.     //下面开始各种排序

  126. /*
  127.     //1、插入排序
  128.     if(!InsertSort(r,len))    //元素个数与数组下表区别好啊
  129.     {
  130.         //打印排序后的数组
  131.         for(i=1;i<=len;i++)
  132.         {
  133.             cout<<"排序后数据:"<
  134.         }
  135.     }
  136. */
  137. /*
  138.     //2、冒泡算法-BubbleSort
  139.     if(!BubbleSort(a,len))    //元素个数与数组下表区别好啊
  140.     {
  141.         //打印排序后的数组
  142.         for(i=0;i
  143.         {
  144.             cout<<"排序后数据:"<
  145.         }
  146.     }
  147. */
  148. /*
  149.     //3、快速排序法练习
  150.     if(!QuickSort(r,1,len))    //元素个数与数组下表区别好啊
  151.     {
  152.         //打印排序后的数组
  153.         for(i=0;i
  154.         {
  155.             cout<<"排序后数据:"<
  156.         }
  157.     }
  158. */
  159.     
  160.     //4、Shell排序算法

  161.     if(!ShellSort(r,len))    //元素个数与数组下表区别好啊

  162.     {
  163.         //打印排序后的数组

  164.         for(i=1;i<=len;i++)
  165.         {
  166.             cout<<"排序后数据:"<<r[i]<<endl;
  167.         }
  168.     }

  169. }
 sort.rar   
阅读(844) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~