Program work 15. Shell Sort in Java

来源:互联网 发布:java 敏感词过滤 开源 编辑:程序博客网 时间:2024/06/05 18:23

Shell本质上就是insertion sort

但是在insertion sort之前, 先做gap大于1的insertion sort

这样在最后一步做insertion sort的时候, 由于数组已经接近排序完成

所以最后的insertion sort会非常快, 最后一步O(n)


时间复杂度根据gap的选取而不同. 这里使用Hibbard的gap, 2的k次方-1: [1, 3, 7, 15, 31, 63, ...]

时间复杂度最好最差和平均都是O(n的3/2次方)


Pseudocode:

gaps = [1, 3, 7, 15, 31, 63, ...]# Start with the largest gap and work down to a gap of 1 foreach (gap in gaps){    for (i = gap; i < n; i += 1)    {        temp = a[i]        for (j = i; j >= gap and a[j - gap] > temp; j -= gap)        {            a[j] = a[j - gap]        }        a[j] = temp    }}


Java:

package ncku.cdc.sorting;import java.util.Random;public class ShellSort {  private int[] sequence;  public ShellSort(int size, int range) {    sequence = new int[size];    Random rand = new Random();    for (int i = 0; i < size; i++) {      sequence[i] = rand.nextInt(range);    }  }    public static void main(String[] args) {      int size = Integer.valueOf(args[0]);      int range = Integer.valueOf(args[1]);      ShellSort shell = new ShellSort(size, range);            System.out.println("before shellSort:");      SortingTools.validation(shell.getSequence(), 0);            shell.shellSort(shell.getSequence(), size);            System.out.println("after shellSort:");      SortingTools.validation(shell.getSequence(), 0);  }  public void shellSort(int[] arr, int len) {    int gap = 1;    while (gap * 2 + 1 < len) {      gap = gap * 2 + 1;    }    for (; gap > 0; gap = getGap(gap)) {      for (int i = gap; i < len; i++) {        int tmp = arr[i];        int j = i;        while (j >= gap && tmp < arr[j - gap]) {          arr[j] = arr[j - gap];          j -= gap;        }        arr[j] = tmp;      }    }  }    private int getGap(int gap) {    int g;    g = (gap - 1) / 2;    return g;  }    public int[] getSequence() {    return sequence;  }}

程序输入: 35 200. 表示生成长度为35, 数字范围在[0, 200)的数组.

程序输出:

before shellSort:
149 37 61 88 140 191 47 177 87 12 148 37 90 84 135 52 81 98 108 97 57 194 43 184 124 143 77 46 36 134 28 133 80 98 111 
after shellSort:
12 28 36 37 37 43 46 47 52 57 61 77 80 81 84 87 88 90 97 98 98 108 111 124 133 134 135 140 143 148 149 177 184 191 194

0 0