基本思想:
希尔排序是对 直接插入排序的改进, 其具体思想为对整个数组用增量来进行分组, 对分组后的数组分别使用简单的直接插入排序, 然后不断的缩小分组, 直到分组为 1, 此时数组绝大部分元素已经有序, 只需要对少量元素进行交换.
大体实现过程: 使用希尔建议的增量, 不断的对数组长度/2 得到增量序列, 对每一个增量都从第一个元素开始按照增量分组, 对分组类的元素进行简单插入排序, 直到最后增量为1时只有一个分组.
最好最坏时间复杂度:
希尔排序属于不稳定排序,最好时间复杂度为 O(n)
java 代码实现:
package my.code.repository.study.algorithm.sort;
import java.util.Arrays;
/**
* @author djh on 2019/7/1 21:32
* @E-Mail 1544579459@qq.com
*/
public class ShellSort {
public static void main(String[] args) {
int[] nums = new int[]{2, 3, 4, 5, -5, 6, 7, 84, 1, 22, 3, 77, 442, 1, 99, 112, 0, 908, 56};
shellSort(nums);
System.out.println(Arrays.toString(nums));
}
private static void shellSort(int[] nums) {
int length = nums.length;
for (int gap = length / 2; gap >= 1; gap /= 2) {
for (int i = 0; i < length; i++) {
int j = i;
while (j + gap < length) {
if (nums[j] > nums[j + gap]) {
int temp = nums[j];
nums[j] = nums[j + gap];
nums[j + gap] = temp;
}
j += gap;
}
}
}
}
}