基本思想:

  希尔排序的实质就是分组插入排序,又称缩小增量法。

  将整个无序序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序时,再对全体元素进行一次直接插入排序。

  因为直接插入排序在元素基本有序的情况下,效率是很高的,因此希尔排序在时间效率上有很大提高。

 实例:

  无序序列:int a[] = {3,1,5,7,2,4,9,6};

  第一趟时: n=8; gap=n/2=4; 把整个序列共分成了4个子序列{3,2}、{1,4}、{5,9}、{7,6}

  第二趟时:gap=gap/2=2; 把整个序列共分成了2个子序列{2,5,3,9}、{1,6,4,7}

  第三趟时:对整个序列进行直接插入排序

  

  希尔排序是不稳定的

 Java实现:

package sort;
/**
* 希尔排序 算法 的实现
* @author 那一季的银杏叶
*
*/
public class ShellSort { public static void main(String[] args) {
// TODO Auto-generated method stub
new ShellSort().run();
} private void run() {
// TODO Auto-generated method stub
int a[] = {3,1,5,7,2,4,9,6};
System.out.println("———————————————————希尔排序算法—————————————————————");
// shellSort(a);
shellSort2(a);
printResult(a,a.length);
}
/**
* 希尔排序(缩小增量法) 属于插入类排序
* 不稳定
* @param a
*/
private void shellSort(int[] a){
int n=a.length;
int gap=n/2;
while(gap>=1){
for(int i=gap;i<a.length;i++){
int j=0;
int temp = a[i];
for(j=i-gap;j>=0 && temp<a[j];j=j-gap){
a[j+gap] = a[j];
}
a[j+gap] = temp;
}
printResult(a,a.length);
gap = gap/2;
}
}
/**
* 严格按照定义来写的希尔排序
* @param a
*/
private void shellSort2(int[] a){
int n=a.length;
int i,j,k,gap;
for(gap=n/2;gap>0;gap/=2){
for(i=0;i<gap;i++){
for(j=i+gap;j<n;j+=gap){
int temp = a[j];
for(k=j-gap;k>=0 && a[k]>temp;k-=gap){
a[k+gap]=a[k];
}
a[k+gap]=temp;
}
}
printResult(a,a.length);
}
}
private void printResult(int[] a, int n){
for(int j=0;j<n;j++){
System.out.print(" "+a[j]);
}
System.out.println();
}
}

 运行结果展示:

  (本文仅供学习交流,如有更好的思路,欢迎留下意见供大家探讨学习~) 

最新文章

  1. VS属性页的目录类型
  2. 一个好用的C#类型转换器
  3. javascript_basic_03之函数、循环、数组
  4. [笔记]Altera系列01:常用资料下载链接
  5. 三元组表压缩存储稀疏矩阵实现稀疏矩阵的快速转置(Java语言描述)
  6. Map集合中的一些具体方法的体现
  7. like的性能问题
  8. (SQL SERVER) (ORACLE) (ACCESS)(POSTGRE SQL)四种数据库操作C#代码
  9. 第2章 rsync(二):inotify+rsync详细说明和sersync
  10. 201521123060 《Java程序设计》第9周学习总结
  11. Netty 系列八(基于 WebSocket 的简单聊天室).
  12. &quot;贪吃蛇&quot;-css3效果
  13. Array.prototype.slice.call引发的思考
  14. 【bzoj3532】 Sdoi2014—Lis
  15. EntityFramework_基础
  16. dp和px,那些不得不吐槽的故事——Android平台图片文字元素单位浅析 (转)
  17. WebApi(2)
  18. Flash Builder 4的快捷方式和调试技巧
  19. controller中两个方法之间共享一个变量LinkedHashMap
  20. 冒泡排序_c++

热门文章

  1. android黑科技系列——应用市场省流量更新(增量升级)原理解析
  2. 24 javascript best practices for beginner(only 23 finally)
  3. three.js 流程图
  4. 【Oracle】DBMS_STATS.GATHER_TABLE_STATS
  5. MAVEN - 生命周期(1)
  6. ANN:DNN结构演进History—RNN
  7. 在jboss上部署web应用
  8. (转)OL记载Arcgis Server切片
  9. 【转】在VMware中为Linux系统安装VM-Tools的详解教程
  10. snv报错