希尔排序
(一)基本思想:
希尔排序: 其实就是加强版的插入排序。首先把待排序的数据根据增量分成几个子序列,对子序列进行插入排序, 直到增量为1,直接进行插入排序;
增量 的选择:一般为数组长度的二分之一,再变为原来增量的二分之一....直到增量为1
比如数据:int a [] = {4,3,8,2,5,7,1,0 } 这时候增量为a.length /2 = 4;所以根据4,把数据分为几个子序列(4,5)(3,7),(8,1)(2,0),然后对子序列进行插入排序
(1)过程如下:
对每一个子序列进行插入排序:
(2)gap = gap/2 = 4/2 =2 这时候子序列为:(4,1,5,8),(3,0,7,2)
(3)gap = gap/2=2/1=1 这时候再进行一次插入排序,就是最后的结果:
(二)代码如下:
public class XiEr {
public static void main(String args[]) {
int a [] = {49,38,65,97,76,13,27,49,55,4};
shellSort(a);
System.out.print("结果为"+ a[0]+","+a[1]+","+a[2]+","+a[3]+","+a[4]+","+a[5]+","+a[6]+","+a[7]+","+a[8]+","+a[9]);
}
public static void shellSort(int[] list) {
int gap = list.length / 2;
while (1 <= gap) {
// 把距离为 gap 的元素编为一个组,扫描所有组
for (int i = gap; i < list.length; i++) {
int j = 0;
int temp = list[i];
// 对距离为 gap 的元素组进行排序
for (j = i - gap; j >= 0 && temp < list[j]; j = j - gap) {
list[j + gap] = list[j];
}
list[j + gap] = temp;
}
System.out.format("gap = %d:\t", gap);
gap = gap / 2; // 减小增量
}
}
}