[学习笔记]Java排序算法:希尔排序(Shell排序)

希尔排序(Shell排序)

希尔排序(缩小增量法) 属于插入类排序,由Shell提出,希尔排序对直接插入排序进行了简单的改进:它通过加大插入排序中元素之间的间隔,并在这些有间隔的元素中进行插入排序,从而使数据项大跨度地移动,当这些数据项排过一趟序之后,希尔排序算法减小数据项的间隔再进行排序,依次进行下去,进行这些排序时的数据项之间的间隔被称为增量,习惯上用字母h来表示这个增量。

常用的h序列由Knuth提出,该序列从1开始,通过如下公式产生:

h = 3 * h +1

反过来程序需要反向计算h序列,应该使用

h=(h-1)/3

 

代码实现:

 

[java]  view plain  copy
  1. public class ShellSortTest {    
  2.     public static int count = 0;    
  3.     
  4.     public static void main(String[] args) {    
  5.     
  6.         int[] data = new int[] { 536219487 };    
  7.         print(data);    
  8.         shellSort(data);    
  9.         print(data);    
  10.     
  11.     }    
  12.     
  13.     public static void shellSort(int[] data) {    
  14.         // 计算出最大的h值    
  15.         int h = 1;    
  16.         while (h <= data.length / 3) {    
  17.             h = h * 3 + 1;    
  18.         }    
  19.         while (h > 0) {    
  20.             for (int i = h; i < data.length; i += h) {    
  21.                 if (data[i] < data[i - h]) {    
  22.                     int tmp = data[i];    
  23.                     int j = i - h;    
  24.                     while (j >= 0 && data[j] > tmp) {    
  25.                         data[j + h] = data[j];    
  26.                         j -= h;    
  27.                     }    
  28.                     data[j + h] = tmp;    
  29.                     print(data);    
  30.                 }    
  31.             }    
  32.             // 计算出下一个h值    
  33.             h = (h - 1) / 3;    
  34.         }    
  35.     }    
  36.     
  37.     public static void print(int[] data) {    
  38.         for (int i = 0; i < data.length; i++) {    
  39.             System.out.print(data[i] + "\t");    
  40.         }    
  41.         System.out.println();    
  42.     }    
  43.     
  44. }   

你可能感兴趣的:(Java排序)