关于希尔排序的分段问题

daydreary 2014-08-05 03:41:07
偶然看到了一个国外介绍排序算法的文章, 里面提到了希尔排序的分段问题
说是3n+1分段比2^n分段要快, 也给出了代码, 但是没详细介绍原理
我试了下代码, 确实快很多
100万随机数据
希尔2^n分组:488ms
希尔3n+1分组:51ms
第二次:435ms 63ms , 第三次:492ms 53ms

没搜到详细的解释,有没有大神讲讲原理, 或者给个传送门?
...全文
145 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
daydreary 2014-08-05
  • 打赏
  • 举报
回复
引用 1 楼 bubu8633 的回复:
源码贴出来看看
在楼上
daydreary 2014-08-05
  • 打赏
  • 举报
回复
源码贴出来,不过是用JAVA写的 原文在:https://d396qusza40orc.cloudfront.net/algs4partI/slides%2F21ElementarySorts.pdf 第42页

public static void shellSort(int[] arr) {
		int len = arr.length;
		int h = 1;
		while (h < len / 3) {
			h = 3 * h + 1;
		}
		while (h >= 1) {
			for (int i = h; i < len; i++) {
				for (int j = i; j >= h && arr[j] < arr[j - h]; j -= h) {
					int temp = arr[j];
					arr[j] = arr[j - h];
					arr[j - h] = temp;
				}
			}
			h /= 3;
		}
	}
lm_whales 2014-08-05
  • 打赏
  • 举报
回复
3n+1 这个序列的数据,排一下看: 3*1+1 =3 是质数 3*2+1 =7 是质数 3*3+1 =10 是和数,但是跟7互质 3*5+1 =16 是和数 3*6+1 =19 是质数,跟16 互质 3*7+1 =22 是和数,跟19 互质 3*8+1 =25 是和数 ,跟22互质 3*9+1 =31 是质数 这个序列,有大量的质数,并且,大部分相邻的两个数,是互质的 2^n 几乎都是和数,并且相邻的两个数都不是互质的。 所以关于希尔排序, 这个增量序列比2^n 要快 如果,这个增量序列,每个数都是质数,还要更快。 具体原因,请看算法导论,或者其他算法类书籍。
冷月清晖 2014-08-05
  • 打赏
  • 举报
回复
源码贴出来看看

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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