插入排序 直接插入排序 希爾排序

2022-02-13 10:34:25 字數 2133 閱讀 6984

一、直接插入排序

1. 思想

直接排序法, 可以分為兩個部分, 一部分是有序的, 一部分是無序的.

從這個圖上, 應該是能看清楚直接插入排序的思想了.

將無序部分的第乙個與有序部分進行比較.

從有序部分的後面向前面比較, 然後不斷地挪動有序部分的資料的位置

static

void insertsort(listlist)

list[j] =temp;}}

2. 複雜度

直接插入排序的最好情況下, 時間複雜度為o(n), 最壞情況下, 複雜度為o(n2);

證明見:

插入排序及其複雜度分析

3. 直接插入排序vs快速排序

從上面的**來看, 直接插入排序需要不斷地挪資料. 如果碰到連續整數, 那麼挪動的資料就多了. 針對這種問題, 是否可以改進一下直接插入排序?

在比較的時候, 我是否可以跳著比較?

二、希爾排序

1. 思想

在比較的時候, 引入縮小增量比較的方式.

第一步. 使增量d=count/2, 將每隔d個數看成是一組無序的數, 然後對這組無序的數進行插入排序

第二步. 使增量d=d/2, 和第一步執行相同的操作, 一直到d=1的時候

}希爾排序與直接插入排序, 中間部分的**基本一直, 不同的只是維度, 直接插入排序的維度是固定的1,

而希爾排序的維度是變化的. 從**上看, 其實還是蠻簡單的, 就拿著直接插入排序改吧改吧就成了.

2. 複雜度

希爾排序的時間複雜度, 和直接插入排序的最好&最壞時間複雜度居然是一樣的, 同志們, 能相信麼.

三、直接插入排序 vs 希爾排序

既然說希爾排序是直接插入排序的改進版, 那麼他們究竟誰更厲害些呢? 會不會越改越差了?

static

void

test()

lista.addrange(list);

console.writeline(

"\n第

" + i + "

次比較:...

", string.join("

,", list.take(10

)));

stopwatch watch = new

stopwatch();

watch.start();

insertsort(list);

watch.stop();

console.writeline(

"" +watch.elapsedmilliseconds);

console.writeline(

"輸出前是十個數:

" + string.join("

,", list.take(10

).tolist()));

watch.restart();

shellsort(lista);

watch.stop();

console.writeline(

"" +watch.elapsedmilliseconds);

console.writeline(

"輸出前是十個數:

從結果上看, 希爾排序的改進效果還是蠻明顯的. 但是希爾排序並不是乙個穩定的排序方式. 也就是說, 還是可能出現比快速排序慢的時候.

插入排序(直接插入排序 希爾排序)

直接插入排序 基本思想 假設待排序的數存放在陣列arr 1.n 中。初始時,arr 1 自成1個有序區,無序區為arr 2.n 從i 2起直至i n為止,依次將arr i 插入當前的有序區arr 1.i 1 中,生成含n個記錄的有序區。演算法複雜度 對於具有n個記錄的檔案,要進行n 1次排序 各種狀...

插入排序 直接插入排序 希爾排序

1.直接插入排序 兩個陣列,有序陣列和無序陣列。排序前 無序陣列裡面所有的值都是無序的,有序陣列沒有值 排序中 無序陣列中拿出乙個數,放到有序陣列當中,有序陣列拿到數,將其按照大小有序的插入到無序陣列中 排序後 無序陣列中沒有數,有序陣列中的數為有序的。假設有一組無序序列 r0,r1,rn 1。1 ...

排序 插入排序(直接插入排序 希爾排序)

插入排序 insertion sort 的基本思想是 每次將乙個待排序的記錄,按其關鍵字大小插入到前面已經排好序的子檔案中的適當位置,直到全部記錄插入完成為止。本節介紹兩種插入排序方法 直接插入排序 和希爾排序。直接插入排序基本思想 1 基本思想 假設待排序的記錄存放在陣列r 1.n 中。初始時,r...