希尔排序也是一种插入式排序,是对直接插入排序的一种改进,希尔排序就是将待排序序列分组,这种分组是将相隔某个增量的记录组成一个子序列,实现跳跃式的移动,使得排序的效率提高。其实这个增量选取还是比较关键的,选取的不当可能导致排序结果不对。可究竟应该取什么增量好,目前还是一个数学难题。
Java版的代码:
package com.qian.sort;
import java.util.Arrays;
public class ShellSort {
public static void sort(int[] nums) {
int increment = nums.length / 2;
int j;
while(increment >= 1) {
for (int i = increment; i < nums.length; i++) {
if(nums[i] < nums[i - increment]) { //交换数据
int temp = nums[i];
for (j = i - increment; j >= 0 && temp < nums[j]; j -= increment) {
nums[j + increment] = nums[j];
}
nums[j + increment] = temp;
}
}
increment = increment / 2;
}
}
public static void main(String[] args) {
int[] nums = { 2, 7, 8, 3, 1, 6, 9, 0, 5, 10, 15, 12};
sort(nums);
System.out.println(Arrays.toString(nums));
}
}
这里的增量选取了increment = increment / 2是一种保险的选择。
复杂度分析:
平均时间复杂度O(n^3/2) ,最好O(n^1.3),最坏O(n^2);