Java 希尔排序
来源:互联网 发布:电子音乐推荐 知乎 编辑:程序博客网 时间:2024/05/18 21:50
希尔排序示意图:
希尔排序,说实话有点难,不过还是弄出来了,代码:
package com.vgbh;public class ShellSorting { private static int n = 10 ;//数组长度 private static int[] arr = new int[n] ;//数组 static PublicOut pc = null ;//定义外部对象 static ShellSorting ss = null ;//定义内部对象 public static void main(String[] args) { pc = new PublicOut(); ss = new ShellSorting(); ss.data(arr,n);//创建数据 System.out.println("希尔排序前:"); pc.prin(arr, n);//打印数据 ss.shell(arr,n);//希尔排序 System.out.println("希尔排序后:"); pc.prin(arr, n);//打印数据 } /* * 希尔排序:将无序数组分割为若干个子序列,子序列不是逐段分割的, * 而是相隔特定的增量的子序列,对各个子序列进行插入排序; * 然后再选择一个更小的增量,再将数组分割为多个子序列进行排序......最后选择增量为1, * 即使用直接插入排序,使最终数组成为有序。 * * 增量的选择:选用Knuth间隔序列 */ //希尔排序 public void shell (int[] arr,int n) { int inner , outer ; int temp ; int h = 1 ; while (h < n) h = h*3 + 1;//(Knuth间隔序列:1,4,13,40,121,...) //System.out.println("\nstart shell sorting:"); while (h > 0) { //System.out.println("\n\n\n当前的h值为:" + h); for (outer=h;outer<n;outer++) { //System.out.println("\n第" + outer + "次循环。"); temp = arr[outer]; inner = outer ; //System.out.println("--------temp:" + temp + "---------inner:" + inner); while (inner>h-1 && arr[inner-h]>=temp) { arr[inner] = arr[inner-h]; inner -= h; //System.out.println(" arr[inner] :" + arr[inner] + " inner:" + inner); } arr[inner] = temp; //System.out.println("++++++arr[inner]:" + arr[inner]); } h = (h-1) / 3; //pc.prin(arr, n); } //System.out.println("end shell sorting:\n"); } public void data (int[] arr,int n) {//排序的数据 for (int i=0;i<n;i++) { arr[i] = 10 - i;//按照一定顺序产生数据:10~0 //arr[i] = (int)(Math.random()*10);//随机产生数据:0~10随机 } }}
1.上边提到的Knuth间隔序列,可以去google搜索一下,那对于哈希排序你会理解一半了。
2.中间有许多测试代码,请自动忽略,下面是一段我自己测试的结果,相信会对你有帮助。
/* 此为数据为{10,9,8,7,6,5,4,3,2,1}时的排序结果,可按照程序的运行结果理解程序的步骤。希尔排序前: 10 9 8 7 6 5 4 3 2 1 ---------------start shell sorting:当前的h值为:13 10 9 8 7 6 5 4 3 2 1 ---------------当前的h值为:4第4次循环。--------temp:6---------inner:4 arr[inner] :10 inner:0++++++arr[inner]:6第5次循环。--------temp:5---------inner:5 arr[inner] :9 inner:1++++++arr[inner]:5第6次循环。--------temp:4---------inner:6 arr[inner] :8 inner:2++++++arr[inner]:4第7次循环。--------temp:3---------inner:7 arr[inner] :7 inner:3++++++arr[inner]:3第8次循环。--------temp:2---------inner:8 arr[inner] :10 inner:4 arr[inner] :6 inner:0++++++arr[inner]:2第9次循环。--------temp:1---------inner:9 arr[inner] :9 inner:5 arr[inner] :5 inner:1++++++arr[inner]:1 2 1 4 3 6 5 8 7 10 9 ---------------当前的h值为:1第1次循环。--------temp:1---------inner:1 arr[inner] :2 inner:0++++++arr[inner]:1第2次循环。--------temp:4---------inner:2++++++arr[inner]:4第3次循环。--------temp:3---------inner:3 arr[inner] :4 inner:2++++++arr[inner]:3第4次循环。--------temp:6---------inner:4++++++arr[inner]:6第5次循环。--------temp:5---------inner:5 arr[inner] :6 inner:4++++++arr[inner]:5第6次循环。--------temp:8---------inner:6++++++arr[inner]:8第7次循环。--------temp:7---------inner:7 arr[inner] :8 inner:6++++++arr[inner]:7第8次循环。--------temp:10---------inner:8++++++arr[inner]:10第9次循环。--------temp:9---------inner:9 arr[inner] :10 inner:8++++++arr[inner]:9 1 2 3 4 5 6 7 8 9 10 ---------------end shell sorting:希尔排序后: 1 2 3 4 5 6 7 8 9 10 --------------- */
3.对于希尔排序,我还是建议动手在纸上演算,其实会出现很多错误,但也会更深刻的理解希尔排序,动手丰衣足食。
有问题的可以联系我的邮箱。
阅读全文
0 0
- java排序-希尔排序
- 希尔排序[Java实现]
- java-------希尔排序
- java希尔排序算法
- 希尔排序 Java
- java希尔排序
- java希尔排序
- Java实现希尔排序
- java的希尔排序
- 希尔排序----java实现
- java希尔排序
- (Java)希尔排序
- java希尔排序算法
- java的希尔排序
- Java代码 希尔排序
- Java-希尔排序
- Java 希尔排序
- java 希尔排序
- Kafka New Consumer API
- 获取JsonObject某一未知key的值
- jsp 接收后台返回数据判断CheckBox是否选中 简单例子只需一句代码
- 获取路径的参数值
- C++ 容器中自定义类型 value_type
- Java 希尔排序
- linux中与mysql兼容的数据库:mariadb
- 板端串口乱码,无数据
- 最短路径题目(Dijkstra)
- uboot之flash初始化
- git push error: 无法推送一些引用到XXX
- docker学习笔记
- java中连接池的几种方式
- redis 空格问题