ソートアルゴリズム---ヒルソート(Javaバージョン)

ヒルソート

原理

まず、テーブルを特定の「増分」で区切られたいくつかのレコードに分割してサブテーブルを形成し、各サブテーブルに直接挿入します。テーブル全体の要素が基本的に正しい場合は、全体を実行します。再度記録直接挿入ソート。ヒルソートは、テーブル内の要素が基本的に順序付けられているため、主に直接挿入ソートの問題を解決しますが、一部の要素はそれ自体から遠く離れているため、より多くの交換が発生します。

ヒルソートのソートプロセスは、コードに示すように実装さ
ここに画像の説明を挿入
ます

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.ヒルソーティングの安定性

同じキーのレコードが異なるサブテーブルに分割されると、それらの間の相対的な順序が変更される可能性があるため、ヒルソートは不安定なソート方法です。

おすすめ

転載: blog.csdn.net/qq_33626996/article/details/113178160