排序ING

Chenchen-發表於2020-11-29

總表

排序方法

時間複雜度(平均)

時間複雜度(最壞)

時間複雜度(最好)

空間複雜度

穩定性

複雜性

直接插入排序

O(n2)

O(n2)

O(n)

O(1)

穩定

簡單

希爾排序

O(nlog2n)

O(n2)

O(n)

O(1)

不穩定

較複雜

直接選擇排序

O(n2)

O(n2)

O(n2)

O(1)

不穩定

簡單

堆排序

O(nlog2n)

O(nlog2n)

O(nlog2n)

O(1)

不穩定

較複雜

氣泡排序

O(n2)

O(n2)

O(n)O(n)

O(1)

穩定

簡單

快速排序

O(nlog2n)

O(n2)

O(nlog2n)

O(nlog2n)

不穩定

較複雜

歸併排序

O(nlog2n)

O(nlog2n)

O(nlog2n)

O(n)

穩定

較複雜

基數排序

O(d(n+r))

O(d(n+r))

O(d(n+r))

O(n+r)

穩定

較複雜

 

簡單插入排序與希爾排序

吐槽:持續更新吧,希爾排序真繞

package piaoshen.openapi.web.test;

public class InsertionSort {
    public static void main(String[] args) {
        int[] ints = {2, 3, 5, 1, 23, 6, 78, 34};
        insertionSort(ints);
        printlnInt(ints, "簡單插入排序");

        int[] arr = {5, 1, 7, 3, 1, 6, 9, 4};
        shellSort(arr);
        printlnInt(arr, "希爾排序");

    }

    /**
     * 簡單插入排序
     * 時間複雜度(平均)O(n2)
     * 時間複雜度(最壞)O(n2)
     * 時間複雜度(最好)O(n)
     * 空間複雜度O(1)
     * 穩定性 穩定
     * 複雜性 簡單
     *
     * @param ints
     */
    private static void insertionSort(int[] ints) {
        for (int i = 1; i < ints.length; i++) {
            //獲取當前值
            int temp = ints[i];
            //迴圈判斷,插入到前面應該有的位置
            for (int j = i; j > 0; j--) {
                //如果上一個比我手裡的小就插入到他的後面
                if (ints[j - 1] > temp) {
                    ints[j] = ints[j - 1];
                    //判斷已經是最後一個了
                    if (j - 1 == 0) {
                        ints[j - 1] = temp;
                        break;
                    }
                } else {
                    ints[j] = temp;
                    break;
                }
                //這種我感覺更像交換
                /*if (ints[j - 1] > temp) {
                    ints[j] = ints[j - 1];
                    ints[j] = temp;
                } */
            }
        }
    }

    private static void printlnInt(int[] ints, String name) {
        System.out.println(name);
        for (int in : ints) {
            System.out.print(in + ",");
        }
        System.out.println("\n");
    }

    public static void shellSort(int[] arr) {
        //希爾排序的增量
        for (int step = arr.length / 2; step > 0; step /= 2) {
            //對一個步長區間進行比較 [step,arr.length)
            for (int i = step; i < arr.length; i++) {
                int value = arr[i];
                int j;
                //對步長區間中具體的元素進行比較
                for (j = i - step; j >= 0 && arr[j] > value; j -= step) {
                    //j為左區間的取值,j+step為右區間與左區間的對應值。
                    arr[j + step] = arr[j];
                }
                //此時step為一個負數,[j + step]為左區間上的初始交換值
                arr[j + step] = value;
            }
        }
    }

}

 

相關文章