老话重弹-希尔排序

Define_Chen 2013-03-14 11:14:11
在网上看到了很多版本的希尔排序,发现都将希尔排序与插入排序的实现分开了,但是希尔就是插入的改良版,因此从逻辑上说是能够复用插入排序代码。
以下是代码:
//incre为1时就是原始的插入排序
void InsertSort(int* first,int* last,int incre = 1);
//增量
const int increment[3] = {5,3,1};
//其实希尔就这么简单
void Shell(int* A,int num)
{
for(int i = 0;i < sizeof(increment) / sizeof(int);++i)
for(int j = 0;j < num - increment[i];++j)
InsertSort(A + j,A + num,increment[i]);
}
//发现STL的处理上下界方法非常好用,如果使用
//void InsertSort(int* A,int num,int incre = 1);
//你会发现在Shell中很难赋值。

void InsertSort(int* first,int* last,int incre)
{
int* pt = first + incre;
while(pt < last)
{
int key = *pt;
int* j = pt - incre;
for(;j >= first && *j > key;j -= incre)
*(j + incre) = *j;
*(j + incre) = key;
pt += incre;
}
}
...全文
88 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Define_Chen 2013-03-14
  • 打赏
  • 举报
回复
哈哈,这么快有回复了啊。 MoreWindows你的算法我看了,主要看了第3种,前两种在网上看到过了。 我发现我和你的思维是不一样的。 你的思维是: 每个原子操作是两个数的比较。 而我的思维是: 将一个数组中需要进行排列的数一次性选出来(其实就是通过插入的递增实现),进行排序。 总结: 1:可能MoreWindows的算法复杂度比我的好些(哈哈,直观上看,有兴趣的朋友可以算算看) 2:但是MoreWindows的算法比较难理解(三层循环,汗颜!!) 3:我发这个帖子的主题是复用插入排序法,而MoreWindows的是直接加工的,显然切入点不同。
MoreWindows 2013-03-14
  • 打赏
  • 举报
回复
呵呵,之前写过一篇《白话经典算法系列之三 希尔排序的实现》 http://blog.csdn.net/morewindows/article/details/6668714 欢迎交流下。
意吟 2013-03-14
  • 打赏
  • 举报
回复
关注。。。

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧