【算法】【JAVA】希尔排序
简介
1. 希尔排序的想法是避免大量的数据移动,先比较那些离的比较远的元素,再比较那些离的比较近的元素,以此类推,逐步逼近基本的插入排序。
2. 希尔排序的创新在于,使用了成为增量序列(increment sequence)的序列,每次循环执行后数组中距离为gap的元素已经是有序的了,当gap为1时,这个循环与插入排序是完全一样的。
3. 如果gap永远不等于1,总是有一些输入无法排序,因此希尔排序最后一定要将gap变为1,剩下的问题就是选择增量序列。
4. 该方法实质上是一种分组插入方法。
5. 增量数列的选择对希尔排序的性能有着极大的影响。[Mark Allen Weiss]指出,最好的增量序列是 Sedgewick提出的 (1, 5, 19, 41, 109,...),该序列的项来自 9 * 4^i - 9 * 2^i + 1 和 4^i - 3 * 2^i + 1 这两个算式。
实现
1 public class ShellSort { 2 public static void ShellSort(int[] a){ 3 for(int increment = a.length/2; increment> 0; increment /= 2){ 4 for(int i =0; i< a.length; i += increment){ 5 for(int k = i; k > 0; k -= increment){ 6 if(a[k]<a[k-increment]){ 7 int tmp = a[k]; 8 a[k] = a[k - increment]; 9 a[k - increment] = tmp; 10 } 11 } 12 } 13 } 14 } 15 }

浙公网安备 33010602011771号