【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 2177|回复: 2

[算法/加密解密] 插入排序之五 希尔排序

[复制链接]
发表于 2013-8-8 13:59:04 | 显示全部楼层 |阅读模式
希尔排序(Shell’s Sort)又称“缩小增量排序”(Diminishing Increment Sort),它也是一种属于插入排序类的方法,但在时间效率上较前述几种排序方法有较大的改进。时间复杂度为O(n^3/2)理解:先将整个待排记录序列分割成为若干子序列,分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序。
  1. void CInsertionSort::ShellSort(void)
  2. {
  3.     const int count = 9, length = count -1;
  4.     int L[count] = {0, 49, 38, 65, 97, 76, 13, 27, 49};
  5.     const int t = 3;
  6.     int dlta[t] = {3, 2 , 1};
  7.     for (int k = 0; k < t; ++k)
  8.     {
  9.         ShellInsert(L, length, dlta[k]);
  10.     }
  11.     //打印排序结果。
  12.     for (int i = 0; i <= length; ++ i)
  13.     {
  14.         cout << L[i] << "\t";
  15.     }
  16.     cout << endl;
  17. }


  18. void CInsertionSort::ShellInsert(int L[], int length, int dk)
  19. {
  20.     for (int i = dk + 1; i <= length; ++ i)
  21.     {
  22.         if (L[i] < L[i - dk])
  23.         {
  24.             L[0] = L[i];
  25.             int j = i - dk;
  26.             while (j > 0 && L[0] < L[j])
  27.             {
  28.                 L[j + dk] = L[j];
  29.                 j -= dk;
  30.             }
  31.             L[j + dk] = L[0];
  32.         }
  33.     }
  34. }
复制代码
和直接排序差不多,只不过是先三三比较,再两两比较,即第一轮[4]和[1]比较,[5]和[2],[6]和[3],[7]和[4],[8]和[5]。简单来说是这样来比较,复杂来说,这只是第一轮的第一次比较,如果符合条件还会进行第一轮的第二次比较。即for循环的while子循环。把数值代进来用大脑跑一下就OK了。
发表于 2014-12-13 14:00:10 | 显示全部楼层
好好好好好好好好好好
发表于 2014-12-17 19:28:30 | 显示全部楼层
Shell’s Sort)又称“缩小增量排序”
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2025-2-6 01:06

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表