【算法】【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 }

 

 

 

posted @ 2013-01-18 16:33  Sayary  阅读(538)  评论(0)    收藏  举报