数据结构和算法(二)算法高级排序——希尔
程序员文章站
2022-06-04 12:45:46
...
前面介绍的三种简单排序适合少数量级数据排序,但遇到大数量级特别慢,为了对大数量级数据排序,采用更复杂的排序方式!
希尔排序是插入排序的升级版,先按大增长量预排序几组数据,最后按增长量为1排全部数据!
比如,增长量为4的插入排序
增长量为2
增长量为1
增长量的计算方式:
int h = 1;
// 先确定初始增长量h
while (h < arr.length / 2) {
h = 2 * h + 1;
}
等这一轮增长量迭代完成,减少增长量:
// 减小增长量h
h = h / 2;
基本实现:
package com.jun.sort;
import java.util.Arrays;
public class BubbleSort{
public static void main(String[] args) {
Integer[] arr = {5,8,6,3,9,2,1,7};
int h = 1;
// 先确定初始增长量h
while (h < arr.length / 2) {
h = 2 * h + 1;
}
// 开始希尔排序
while (h >= 1) {
//在每一轮增长量下迭代插入排序---外部迭代决定当前增长量下划分组数h---arr.length-1
for (int i = h; i < arr.length; i++) {
//内部迭代将每一组所有元素倒序插入排序
for (int j = i; j >= h; j-=h) {
if (arr[j] < arr[j - h]) {
int swap = arr[j - h];
arr[j - h] = arr[j];
arr[j] = swap;
}
else {
break;
}
}
}
// 减小增长量h
h = h / 2;
}
System.out.println(Arrays.toString(arr));
}
}
结果:
[1, 2, 3, 5, 6, 7, 8, 9]
对于希尔排序的时间复杂度O无法确定!