希尔排序:
希尔排序又称为缩小增量法,是对直接插入排序算法的最坏情况的优化。
实现过程:
先将数据分成不同的组,对每一组进行排序,然后再对所有元素进行一次插入排序,减少数据交换和移动的次数。
在进行希尔排序时,要先知道数组的长度,根据长度确定步长大小。
当步长为1时,采用直接插入排序。
具体实现由下图所示:
时间复杂度:
希尔排序的时间复杂度与增量(步长len)的选取有关。
平均情况下:时间复杂度为O(n^1.3);
最好情况下:时间复杂度为O(n);
最坏情况下:时间复杂度为O(n^2);
希尔排序是一种不稳定的算法,对于相同的两个数,可能由于分在不同的组中而导致它们的顺序发生变化。适合排序逆序的数据。
空间复杂度:O(1)
代码实现:
import java.util.Arrays;
/**
* Description :希尔排序
*/
public class ShellSort {
public static int[] shellSort(int[] arr){
//数组为空或只有一个元素时,直接返回数组
if (arr.length<2){
return arr;
}
//获得每次分组的步长
int len = arr.length/2;
while (len >= 1){
for (int i = len; i < arr.length; i++) {
int insertNote = arr[i];
int j = i - len;
while (j >= 0 && insertNote < arr[j]){
arr[j+len] = arr[j];
j-=len;
}
arr[j + len] = insertNote;
}
len = len/2;
}
return arr;
}
public static void main(String[] args) {
int[] arr = {1, 7, 12, 11, 0, 99, 32,78, 17, 5 };
System.out.println("排序之前:"+Arrays.toString(arr));
shellSort(arr);
System.out.println("排序之后:"+Arrays.toString(arr));
}
}
运行结果: