一、直接插入排序
1. 思想
直接排序法, 可以分為兩個部分, 一部分是有序的, 一部分是無序的.
從這個圖上, 應該是能看清楚直接插入排序的思想了.
將無序部分的第乙個與有序部分進行比較.
從有序部分的後面向前面比較, 然後不斷地挪動有序部分的資料的位置
static2. 複雜度void insertsort(listlist)
list[j] =temp;}}
直接插入排序的最好情況下, 時間複雜度為o(n), 最壞情況下, 複雜度為o(n2);
證明見:
插入排序及其複雜度分析
3. 直接插入排序vs快速排序
從上面的**來看, 直接插入排序需要不斷地挪資料. 如果碰到連續整數, 那麼挪動的資料就多了. 針對這種問題, 是否可以改進一下直接插入排序?
在比較的時候, 我是否可以跳著比較?
二、希爾排序
1. 思想
在比較的時候, 引入縮小增量比較的方式.
第一步. 使增量d=count/2, 將每隔d個數看成是一組無序的數, 然後對這組無序的數進行插入排序
第二步. 使增量d=d/2, 和第一步執行相同的操作, 一直到d=1的時候
}希爾排序與直接插入排序, 中間部分的**基本一直, 不同的只是維度, 直接插入排序的維度是固定的1,
而希爾排序的維度是變化的. 從**上看, 其實還是蠻簡單的, 就拿著直接插入排序改吧改吧就成了.
2. 複雜度
希爾排序的時間複雜度, 和直接插入排序的最好&最壞時間複雜度居然是一樣的, 同志們, 能相信麼.
三、直接插入排序 vs 希爾排序
既然說希爾排序是直接插入排序的改進版, 那麼他們究竟誰更厲害些呢? 會不會越改越差了?
staticvoid
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...