排序演算法之一插入排序 直接插入和希爾排序

2021-09-23 19:56:17 字數 2539 閱讀 1740

本文的圖均引用自**為結合眾家思想以及自己的方式而來。

下面是一些排序的關係圖:

(1)基本思想:在要排序的一組數中,假設前面(n-1)[n>=2]個數是排好序的,現在要把第n個數插到前面的有序數中,使得這n個數也是排好序的。如此反覆迴圈,知道全部排好順序。

(2)例項:

(3)**實現:

123

4567

891011

1213

1415

1617

1819

2021

2223

24

/**

* 插入排序

*/private

static

> void

insertsort

(anytype arr)

arr[j] = current;

system.out.println(arrays.tostring(arr));

}/**

原陣列為: [23, 1, 42, 5, 2, 23, 12]

[1, 23, 42, 5, 2, 23, 12]

[1, 23, 42, 5, 2, 23, 12]

[1, 5, 23, 42, 2, 23, 12]

[1, 2, 5, 23, 42, 23, 12]

[1, 2, 5, 23, 23, 42, 12]

[1, 2, 5, 12, 23, 23, 42]*/}

(1)基本思想:演算法先將要排序的一組數按某個增量d(n/2,n為要排序的個數)分成若干組,每組中記錄的下標相差d。對每組中全部元素進行直接插入排序,然後再用乙個較小的增量(d/2)對它進行分組,在每組中再進行直接插入排序。當增量減到1時,進行直接插入排序後,排序完成。

(2)例項:

(3)實現:

123

4567

891011

1213

1415

1617

1819

2021

2223

2425

2627

2829

3031

3233

3435

3637

3839

/**

* 希爾排序

* 利用增量進行分組,再對分組的數進行直接插入排序

*/private

static

> void

shellsort

(anytype arr)

system.out.println("開始第: " + ++changestepcount + "次迴圈,目前增量為: " + step);

for (int x = 0; x < step; x ++)

arr[j] = current;

}system.out.println(arrays.tostring(arr));}}

/**原陣列為: [23, 1, 42, 5, 2, 23, 12]

開始第: 1次迴圈,目前增量為: 3

[5, 1, 42, 12, 2, 23, 23]

[5, 1, 42, 12, 2, 23, 23]

[5, 1, 23, 12, 2, 42, 23]

開始第: 2次迴圈,目前增量為: 1

[1, 2, 5, 12, 23, 23, 42]*/}

希爾排序以及效率

希爾排序因計算機科學家donald l. shell而得名,他在2023年發現了希爾排序演算法。希爾排序基於插入排序,但是增加了乙個新的特性,大大地提高了插入排序的執行效率。依靠這個特別的實現機制,希爾排序對於多達幾千個資料項的,中等大小規模的陣列排序表現良好。希爾排序不像快速排序和其它時間複雜度為o(n*logn)的排序演算法那麼快,因此對非常大的檔案排序,它不是最優選擇。但是,希爾排序比選擇排序和插入排序這種時間複雜度為o(n2)的排序演算法還是要快得多,並且它非常容易實現。它在最壞情況下的執行效率和在平均情況下的執行效率相比沒有差很多。

迄今為止,除了在一些特殊的情況下,還沒有人能夠從理論上分析希爾排序的效率。有各種各樣基於試驗的評估,估計它的時間級從o(n3/2)到o(n7/6)。

插入排序

由於希爾排序是基於插入排序的。回想一下在插入排序執行的一半的時候,標記符左邊這部分資料項都是排過序的,而標記右邊的資料項則沒有排過序。這個演算法取出標記符所指的資料項,把它儲存在乙個臨時變數裡。接著,從剛剛被移除的資料項的左邊第乙個單元開始,每次把有序資料項向右移動乙個單元,直到儲存在臨時變數裡的資料項能夠有序回插。

下面是插入排序帶來的問題。假設乙個很小的資料項在很靠近右端的位置上,這裡本來應該是值比較大的資料項所在的位置。把這個小資料項移動到在左邊的正確位置上,所有的中間資料項都必須向右移動一位。這個步驟對每乙個資料項都執行了將近n次的複製。雖不是所有資料項都必須移動n個位置,但是資料項平均移動了n/2個位置,這就是執行了n次n/2個移位,總共是n2/2次複製。因此,插入排序的執行效率是o(n2)。

如果能以某種方式不必乙個乙個地移動所有中間的資料項,就能把較小的資料項移動到左邊,那麼這個演算法的執行效率就會有很大的改進。

排序演算法 一 插入排序 直接插入排序 希爾排序

當插入第i i 1 個元素時,前面的array 0 array 1 array i 1 已經排好序,此時用array i 的排序碼與array i 1 array i 2 的排序碼順序進行比較,找到插入位置即將array i 插入,原來位置上的元素順序後移。最差時間複雜度 最壞情況為輸入序列是降序排...

排序演算法 插入排序 直接插入

借鑑的網上排序演算法資料 寫一下自己怎麼理解的直接插入排序的 只是為了自己看懂 以便忘記的時候檢視,希望大神不要噴,有什麼不好的可以指出 詳細的請看 public static int a public void print int a system.out.println test 檔案初態不同時...

排序演算法 插入排序 直接插入排序

package 插入排序 直接插入排序 從後向前找到合適位置後插入 穩定 基本思想 每步將乙個待排序的記錄,按其順序碼大小插入到前面已經排序的字序列的合適位置 從後向前找到合適位置後 直到全部插入排序完為止。public class 直接插入排序 system.out.println 排序之前 fo...