A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 帅的惊动党中央 中级黑马   /  2015-4-22 19:23  /  806 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

希尔排序:将无序数组分割为若干个子序列,子序列不是逐段分割的,而是相隔特定的增量的子序列,对各个子序列进行插入排序;然后再选择一个更小的增量,再将数组分割为多个子序列进行排序......最后选择增量为1,即使用直接插入排序,使最终数组成为有序。
  1. /********************************************************
  2. *函数名称:ShellInsert
  3. *参数说明:pDataArray 无序数组;
  4. *          d          增量大小
  5. *                   iDataNum为无序数据个数
  6. *说明:    希尔按增量d的插入排序
  7. *********************************************************/
  8. void ShellInsert(int* pDataArray, int d, int iDataNum)
  9. {
  10.         for (int i = d; i < iDataNum; i += 1)    //从第2个数据开始插入
  11.         {
  12.                 int j = i - d;
  13.                 int temp = pDataArray[i];    //记录要插入的数据
  14.                 while (j >= 0 && pDataArray[j] > temp)    //从后向前,找到比其小的数的位置
  15.                 {
  16.                         pDataArray[j+d] = pDataArray[j];    //向后挪动
  17.                         j -= d;
  18.                 }

  19.                 if (j != i - d)    //存在比其小的数
  20.                         pDataArray[j+d] = temp;
  21.         }
  22. }

  23. /********************************************************
  24. *函数名称:ShellSort
  25. *参数说明:pDataArray 无序数组;
  26. *                   iDataNum为无序数据个数
  27. *说明:    希尔排序
  28. *********************************************************/
  29. void ShellSort(int* pDataArray, int iDataNum)
  30. {
  31.         int d = iDataNum / 2;    //初始增量设为数组长度的一半
  32.         while(d >= 1)
  33.         {
  34.                 ShellInsert(pDataArray, d, iDataNum);
  35.                 d = d / 2;    //每次增量变为上次的二分之一
  36.         }
  37. }
复制代码



4 个回复

倒序浏览
学习了············
回复 使用道具 举报
增量设二分之一会不太稳定,我试过呢
回复 使用道具 举报
JarryHorse 发表于 2015-4-22 20:55
增量设二分之一会不太稳定,我试过呢

那设多少比较稳定呢
回复 使用道具 举报

呃···希尔本身就是个不稳定的算法,增量变化越小越稳定,比如···1
回复 使用道具 举报 1 0
您需要登录后才可以回帖 登录 | 加入黑马