希尔排序算法描述:
- 将一个数据序列分成若干组,每组由若干相隔一段距离(称为增量delta)的元素组成,在一个组内采用直接插入排序算法进行排序。
- 增量delta初值通常为数据序列长度的一半,以后每趟增量减半,最后值为1。随着增量逐渐减小,组数也减少,组内元素个数增加,数据序列接近有序。
例如:
数组{38,55,65,97,27,76,28,13,19},初始增量delta为4,则{38,27,19}构成一组,在这一组中采用直接插入排序。
算法实现:
使用3个for循环嵌套实现数组,外层for循环起到每趟增量减少一半的作用。里面两层for循环则是直接插入排序算法,只是间隔由1更改为delta。
public class ShellSort {
/**
*希尔排序
* @param a 待排序数组
*/
private static void shellSort(int[] a){
for (int delta = a.length/2;delta > 0;delta /= 2){
//以下两个循环与直接插入排序算法代码类似,只是希尔排序中的间隔由1更改为delta,
// 因为希尔排序是根据delta将数组分成几个组,而相隔delta的元素构成一个组,
// 在这个组中进行直接插入排序
for (int i = 0;i < a.length - delta;i++){
int temp = a[i + delta],j;
for (j = i;j >= 0 && temp < a[j];j -= delta){
a[j + delta] = a[j];
}
a[j + delta] = temp;
}
}
}
public static void main(String[] args) {
int[] a = new int[]{38,55,65,97,27,76,27,13,19};
shellSort(a);
System.out.println(Arrays.toString(a));
}
}
[13, 19, 27, 27, 38, 55, 65, 76, 97]