ヒルソート
原理
まず、テーブルを特定の「増分」で区切られたいくつかのレコードに分割してサブテーブルを形成し、各サブテーブルに直接挿入します。テーブル全体の要素が基本的に正しい場合は、全体を実行します。再度記録直接挿入ソート。ヒルソートは、テーブル内の要素が基本的に順序付けられているため、主に直接挿入ソートの問題を解決しますが、一部の要素はそれ自体から遠く離れているため、より多くの交換が発生します。
ヒルソートのソートプロセスは、コードに示すように実装され
ます
public class ShellSort {
public static void main(String[] args) {
shellSort();
}
//交换法实现shell排序
public static void shellSort() {
int[] arr = {
8, 9, 1, 7, 2, 3, 5, 4, 6, 0};
int temp = 0;
//gap代表步长
for (int gap = arr.length / 2; gap > 0; gap /= 2) {
// i是arr[gap]之后的元素arr[5]-arr[9]
for (int i = gap; i < arr.length; i++) {
// 遍历各组中所有的元素(共gap组,每组有个元素), 步长gap
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;
}
}
}
System.out.println(Arrays.toString(arr));
}
}
//对交换式的希尔排序进行优化->移位法
public static void shellSort2() {
int[] arr = {
8, 9, 1, 7, 2, 3, 5, 4, 6, 0};
for (int gap = arr.length/2; gap >0; gap/=2) {
// 从第gap个元素,逐个对其所在的组进行直接插入排序
for (int i = gap; i < arr.length; i++) {
int j = i;
int temp = arr[j];
if (arr[j] < arr[j - gap]) {
while (j - gap >= 0 && temp < arr[j - temp]) {
//移动
arr[j] = arr[j - gap];
j -= gap;
}
//当退出while后,就给temp找到插入的位置
arr[j] = temp;
}
}
}
}
}
1.ヒルソーティングの時間計算量
最悪の場合、ヒルソートの時間計算量はO(n ^ 2)です。
2.ヒルソーティングのスペースの複雑さ
一定数の補助ユニットのみが使用されるため、スペースの複雑さはO(1)です。
3.ヒルソーティングの安定性
同じキーのレコードが異なるサブテーブルに分割されると、それらの間の相対的な順序が変更される可能性があるため、ヒルソートは不安定なソート方法です。