希尔(Shell sort)算法
作为初学者,看到书中希尔算法部分,完全不知道书上的内容是写的什么,一个个N,K,J等符号,看的我如坠入云中,不知所云。书上的推导过程更加让我迷惑,根本不知道数与数之间是如何产生关系的。
于是我上网搜索关于希尔排序的文章,大部分文章写几句关键点并把实现代码写出来就没有了,而且语言晦涩难懂,本来就不理解什么是希尔排序,看到这样的文章更加迷惑。
翻看的多篇文章之后,终于找到了一篇适合我看的文章-
白话经典算法系列之三 希尔排序的实现(http://blog.csdn.net/morewindows/article/details/6668714)
作者通过一个数组例子,详细的分析了希尔排序代码的执行过程,并给出了不同简化程度的源代码。说了这么多,好像是做广告了。呵呵,反正我是看这篇文章,学会了希尔排序。
package it.cast.sort;
public class Shellsort {
// 希尔算法(shell)核心思想:
/*
* 将一组比较长多的数按照一定的 数学公式进行分组(有很多分组方法,没有定论,这里选用gap=gap/2的分组方法,但是最后一个gap必须等于1)
* 分组结束后,在组内进行插入算法排序。每进行一次分组,就进行一次插入排序。当gap=1进行分组并排序完成后 shell算法整体结束
*/
// 建议按照代码手动推导几个循环,观察推导过程,这样做便于理解代码的含义。
// 最容易理解,最直观的希尔排序
public static void shellsort1(int[] a) {for (int gap = a.length / 2; gap > 0; gap /= 2) {for (int i = 0; i < gap; i++) {for (int j = gap+i; j < a.length; j += gap) {if (a[j] < a[j -gap]){int temp = a[j]; int k = j - gap;for (; k >= 0 &&a[k] > temp; k -= gap) {
a[k + gap] = a[k]; }
a[k + gap] = temp; } }// 插入算法}}}
// 经过简化的shell算法
public static void shellsort2(int[] a) {for (int gap = a.length / 2; gap > 0; gap /= 2) {for (int i = gap; i < a.length; i++) {if (a[i] < a[i - gap]) {int temp = a[i];int k = i - gap;for (; k >= 0 && a[k] > temp; k -= gap) {a[k + gap] = a[k];}a[k + gap] = temp;}}}}
// 更加简介的算法(将直接插入算法改为了冒泡算法)
public static void shellsort3(int[] a) {for (int gap = a.length / 2; gap > 0; gap /= 2) {for (int i = gap; i < a.length; i++) {for (int k = i - gap; k >= 0 && a[k] > a[k + gap]; k -= gap)/** 将插入算法改为了冒泡算法 , 即相邻之间的数据进行比较 , 如果前面的数据大于后边的数据 , 然后进行位置交换*/{int t = a[k + gap];a[k + gap] = a[k];a[k] = t;}}}}
//测试
public static void main(String[] arge) {int a[] = { 1, 4, 3, 2, 6, 5, 43, 6, 6, 8, 90, 5, 64, 4, 65, 445, 3,4343, 3432211, 12, 211, 12 };// 统计所用时间double begin = System.currentTimeMillis(); // 这段代码放在程序执行前for (int i = 0; i < 100000; i++) {// shellsort(a);// shellsort(a);shellsort1(a);// shellsort2(a);// shellsort3(a);}double end = System.currentTimeMillis() - begin; // 这段代码放在程序执行后System.out.println("耗时:" + end + "毫秒");//遍历数组中的数字for (int i = 0; i < a.length; i++) {System.out.println(a[i]);}}
}
希尔(Shell sort)算法相关推荐
- C语言实现希尔排序shell sort算法之一(附完整源码)
希尔排序shell sort算法 希尔排序shell sort算法的完整源码(定义,实现,main函数测试) 希尔排序shell sort算法的完整源码(定义,实现,main函数测试) #includ ...
- C语言实现希尔排序shell sort算法之二(附完整源码)
希尔排序shell sort算法 希尔排序shell sort算法的完整源码(定义,实现,main函数测试) 希尔排序shell sort算法的完整源码(定义,实现,main函数测试) #includ ...
- 图解希尔排序——希尔排序算法(shell sort)
希尔排序 shell sort 算法图解 算法实现(C语言) 算法分析 希尔排序又叫缩小增量排序,它是对直接插入排序算法的一种改进.希尔排序算法的基本思想是先将整个待排序的序列划分为若干个子序列,然后 ...
- C++shell sort希尔排序的实现算法之二(附完整源码)
C++shell sort希尔的实现算法 C++shell sort希尔的实现算法完整源码(定义,实现,main函数测试) C++shell sort希尔的实现算法完整源码(定义,实现,main函数测 ...
- C++shell sort希尔排序的实现算法之一(附完整源码)
C++shell sort希尔排序的实现算法 C++shell sort希尔排序的实现算法完整源码(定义,实现,main函数测试) C++shell sort希尔排序的实现算法完整源码(定义,实现,m ...
- 经典排序算法 - 希尔排序Shell sort
经典排序算法 - 希尔排序Shell sort 希尔排序Shell Sort是基于插入排序的一种改进,同样分成两部分, 第一部分,希尔排序介绍 第二部分,如何选取关键字,选取关键字是希尔排序的关键 第 ...
- 排序算法研究之希尔排序(shell sort)
前面几个小节,我们分别介绍了冒泡排序,插入排序,直接快速排序 ,选择排序本节,我们介绍插入排序的改进版的希尔排序. 希尔排序是1959年,Shell发明的,这是第一个突破O(n2)的排序算法,他与直接 ...
- Shell Sort 希尔排序 收藏
Shell Sort 希尔排序 收藏 希尔排序(Shell Sort)又叫做缩小增量排序(diminishing increment sort),是一种很优秀的排序法,算法本身不难理解,也很容易实现, ...
- 排序 —— 希尔排序(Shell sort)
希尔排序(Shell sort)的名称源于它的发明者 Donald Shell,该算法是冲破二次时间屏障(冒泡和插入排序,基于相邻元素的交换)的第一批算法.希尔排序改进了冒泡和插入排序的相邻元素才进行 ...
最新文章
- 现代操作系统:第三章 内存管理
- kafka内存不断增加_为什么 Kafka 能这么快的 6 个原因
- 数据库连接字符串 mysql_数据库连接字符串(MySQL,SQL Server,Oracle)
- matlab图像大作业,MATLAB图像大作业
- MLP多层感知机(人工神经网络)原理及代码实现
- 【转】css_重绘重排
- chartControl
- 弘辽科技:淘宝保证金解冻后店铺还在吗?保证金怎么解冻?
- 论软件测试工程师面试套路和暗语灵魂解密
- 字节架构师:来说说 Kafka 的消费者客户端详解,你都搞懂了吗,Javaweb面试总结
- 华为机式(矩阵相乘)
- Rosalind第七题:孟德尔第一定律
- 性能可靠服务器虚拟化,服务器虚拟化下的网络变迁
- 一个神器的插件:Piti
- 利用铁匠组件实现在线头像截图的效果
- 保护健康早休息-人体器官作息时间表
- 旺旺的新故事太多,消费者该记住哪一个?
- tdd干扰波形_LTE中5大干扰源的产生分析
- 基于PLC的智能农业温室大棚控制系统设计大棚电气控制组态 温室大棚组态 温室组态
- sothink swf decompiler反编译的常见错误