希尔排序算法的思路
希尔排序算法也是一种插入排序,由于在直接插入算法中,当要插入的数很小的时候,有序表中的后移次数会增多,所以会影响效率。
希尔排序是将待排序的元素按照一定的增量(gap)进行分组,在每一组中进行直接插入排序,在一个增量下完成每组的直接插入排序后,更新增量,再进行每组的直接插入排序。直至增量为1,则排序完成。
希尔排序算法的性质
1、最差时间复杂度:O(n^s)其中1<s<2,s是所选的分组
2、平均时间复杂度:O(nlogn)
3、稳定性:不稳定
希尔排序算法的代码实现
这里进行从小到大排序
public static void shellSort(int[] arr) {
int temp = 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;
}
}
}
}
}
主函数进行验证
public static void main(String[] args) {
int[] arr = {8,9,1,7,2,3,5,4,6,0,3,2};
shellSort(arr);
System.out.println(Arrays.toString(arr));
}
结果如下:[0, 1, 2, 2, 3, 3, 4, 5, 6, 7, 8, 9]