1 希尔排序原理
希尔排序也成为“缩小增量排序”,其基本原理是,现将待排序的数组元素分成多个子序列,使得每个子序列的元素个数相对较少,然后对各个子序列分别进行直接插入排序,待整个待排序列“基本有序”后,最后在对所有元素进行一次直接插入排序。因此,我们要采用跳跃分割的策略:将相距某个“增量”的记录组成一个子序列,这样才能保证在子序列内分别进行直接插入排序后得到的结果是基本有序而不是局部有序。希尔排序是对直接插入排序算法的优化和升级。
2 时间复杂度
希尔排序是插入排序的优化,其实现也与插入排序很相似,只是在插入排序的基础上将步数进行调整,使得数据整体更加相对有序,正因为如此,希尔排序的性能和插入排序一样,受原始数据影响较大,其时间复杂度不确定,最坏时间复杂度为o(n^2) ,平均时间复杂度为O(logn*n)。我理解的希尔排序
3 实现
/**
* 希尔排序 --优化的插入排序
*/
public class ShellSort {
public static void sort(int[] arr) {
for (int increament = arr.length / 2; increament > 0; increament /= 2) {
for (int i = increament; i < arr.length; i++) {
for (int j = i; j >= increament && arr[j] < arr[j - increament]; j-=increament) {
swap(arr,j,j-increament);
}
}
}
}
public static void swap(int[] arr, int a, int b) {
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
/**
* 测试
*
* @param args
*/
public static void main(String[] args) {
int[] arr = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };
ShellSort.sort(arr);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]);
System.out.print(' ');
}
System.out.println();
}
}