概述:希尔排序的由来。由于【插入】排序每次位移数组插入值时会影响效率,如下表。

所以希尔排序是在插入排序的基础上,对插入排序进行优化的一种排序算法。亦称‘缩小增量排序’。
希尔排序思路:
1、按数组长度的下标进行‘增量’分组,若增量不为1,则将分组的数组进行一次排序。
2、直到‘增量’为1时停止分组,同时进行最后一次排序。
(也就是除以‘增量’,分成几组、分成只有‘增量为1’的组数的时候才停止分组,同时再将全部分组当做一组数组进行排序)

替换法 代码实现:
public class ShellSortOfTeacher {
public static void main(String[] args) {
// TODO Auto-generated method stub
int [] arr = {8,9,1,7,2,3,5,4,6,0};
System.out.println("希尔排序前的数组为=" + Arrays.toString(arr));
shellsort(arr);
}
//交换式的shell排序法。
public static void shellsort(int arr[]) {
int temp = 0;
int count = 0;
for(int gap = arr.length / 2;gap > 0;gap /= 2) {
for(int i = gap; i < arr.length ; i++) { //将数组的长度分为‘增量‘组
for(int j = i - gap; j >= 0; j -= gap) {
if(arr[j] > arr[j+gap]) {
temp = arr[j];
arr[j] = arr[j+gap];
arr[j+gap] = temp;
}
}
}
}
System.out.println("实现了第" + ++count + "次希尔排序后的数组为=" + Arrays.toString(arr));
}
}
移动法 代码实现:
public static void shellsort2(int arr []) {
//增量gap,并逐步的缩小增量
for(int gap = arr.length / 2; gap > 0; gap /= 2) {
//从第gap个元素,逐个对其所在的组进行直接插入排序
for(int i = gap; i < arr.length; i++) {
int j =i;
int temp = arr[j];
if(arr[j] < arr[j - gap]) {
while(j - gap >= 0 && temp < arr[j - gap]) {
//移动
arr[j] = arr[j - gap];
j -= gap;
}
//当退出while后,就给temp找到插入的位置
arr[j] = temp;
}
}
}
}
来源:oschina
链接:https://my.oschina.net/u/4432600/blog/4273374