java排序算法(八):希尔排序(shell排序)
java排序算法(八):希尔排序(shell排序)
希尔排序(缩小增量法)属于插入类排序,由shell提出,希尔排序对直接插入排序进行了简单的改进,它通过加大插入排序中元素之间的间隔,并在这些有间隔的元素中进行插入排序,从而使数据项大跨度的移动。当着写数据项拍过一趟序之后,希尔排序算法缩小数据项的间隔再进行排序,一次进行下去。进行这些排序时的数据项直接的间隔被称为增量,习惯上用字母h来表示增量
常用的h序列有Knuth提出,该序列从1开始,通过如下公式产生
h=3*h+1;
反过来程序需要反向计算h的值
h = h-1/3
代码实现
package com.spring.test; /** * 希尔排序 */ public class ShellSortTest { public static int count = 0; public static void main(String[] args) { int[] data = new int[] { 5, 3, 6, 2, 1, 9, 4, 8, 7 }; print(data); shellSort(data); System.out.println("排序后的结果"); print(data); } /** * 希尔排序 * @param data */ public static void shellSort(int[] data){ //计算出最大的h值 int h = 1; while(h < data.length/3){ h = h*3+1; } while(h > 0){ for(int i = h;i<data.length;i+=h){ if(data[i] < data[i-h]){ int tmp = data[i]; int j = i-h; while(j >=0 && data[j] >tmp){ data[j+h] =data[j]; j-=h; } data[j+h] = tmp; print(data); } } // 计算出下一个h值 h = (h - 1) / 3; } } /** * 打印输出 */ public static void print(int[] data){ for(int i=0;i<data.length;i++){ System.out.print(data[i]+"\t"); } System.out.println(); } }
运算结果