一、希尔排序说明:
1. 希尔排序是由于计算机科学家Shell而得名,他在1959年发明了希尔排序算法。希尔排序是基于插入排序,增加了一些新的特性,提高了插入排序的效率。
2. 回顾以往我们的插入排序,会发现,如果一个最小的元素在最右端,进行插入排序时,将他取出放入临时变量,几乎所有的元素都要向右移动一位,效率会非常的低。而希尔排序正好对他进行了改进。
3. 希尔排序的原理是通过加大插入排序中元素之间的间隔,并在这些有间隔的元素中进行插入排序,从而使数据项能够大跨度的移动,当这些数据项排过一趟序之后,在减小间隔进行第二次排序,依次下去。进行排序时,数据项之间的间隔称为增量,用字母h表示。
二、Java语言描述希尔排序算法:
package com.solid.sort;
public class ShellSort {
//数组
private int[] arr;
//元素个数
private int nElems;
/**
* 构造方法
* @param maxSize
*/
public ShellSort(int maxSize) {
arr = new int[maxSize];
nElems = 0;
}
/**
* 插入元素
* @param key
*/
public void insert(int key) {
arr[nElems++] = key;
}
/**
* 希尔排序
*/
public void shellSort() {
int inner, outer;
int temp;
//找出h的初始值{1, 4, 13, 40, ......}
int h = 1;
while(h <= nElems/3) {
h = h*3 + 1;
}
while(h > 0) {
for(outer=h; outer<nElems; outer++) {
temp = arr[outer];
inner = outer;
while(inner > h-1 && arr[inner-h] >= temp) {
arr[inner] = arr[inner-h];
inner = inner - h;
}
arr[inner] = temp;
}
h = (h-1) / 3;
}
}
/**
* 打印数组中的所有元素
*/
public void display() {
for(int i=0; i<arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
/**
* 测试main方法
* @param args
*/
public static void main(String[] args) {
ShellSort shell = new ShellSort(10);
shell.insert(1);
shell.insert(3);
shell.insert(5);
shell.insert(7);
shell.insert(9);
shell.insert(2);
shell.insert(4);
shell.insert(6);
shell.insert(8);
shell.insert(10);
shell.display();
shell.shellSort();
shell.display();
}
}