希尔排序
原数组:5 7 8 3 1 2 4 6(每次取每组里面最小值,之后每组从第二小值取值,依此类推取到值完)
以数组长度一半(4)进行分组再排序1,5
2,7
4,8
3,6
就变成1 2 4 3 5 7 8 6
再以数组长度一半后的一半(2)再进行分组再排序1,4,5,8
2,3,6,7
就变成1 2 4 3 5 6 8 7
再以数组长度一半后的一半后的一半(1)进行分组再排序1,2,3,4,5,6,7,8
注:方法里面的排序方法可以用插入排序的两种方法
方法一
public void shellSort(int[] arr) {
int length = arr.length;
for (int gap = length/2; gap > 0; gap /= 2) {
for (int i = gap; i < length; i++) {
int inserted = arr[i];
for (int j = i - gap; j >= 0; j -= gap) {
if (arr[j] > inserted) {
int temp = arr[j];
arr[j] = inserted;
arr[j+gap] = temp;
continue;
}
break;
}
}
}
}
方法二
public void shellSort(int[] arr) {
int length = arr.length;
// 数组长度的一半作为增量(gap),每次取一半
for (int gap = length/2; gap > 0; gap /= 2) {
// 增量位置索引向上进行插入操作(里面是根据增量gap进行分组再进行插入操作的)
for (int i = gap; i < length; i++) {
int inserted = arr[i];
int j = i - gap;
// 最简单的插入操作的间隔值是1,这个只是改成值是增量gap
for (; j >= 0 && arr[j] > inserted; j -= gap) {
arr[j+gap] = arr[j];
}
arr[j+gap] = inserted;
}
}
}