希爾排序法優化

2021-07-11 07:52:28 字數 1364 閱讀 8574

希爾排序法的**實現:

package main

import (

"fmt"

"math/rand"

"time"

)func main()

start := time.now()

shellsort(list)

end := time.now()

dur := end.sub(start)

fmt.println(dur) // 顯示消耗的時間

}// 希爾排序函式

func shellsort(list int) }}

}

output:

command-line-arguments

24.0993784s

經過多次測試,10萬個隨機數排序所需要的時間基本都維持在25秒左右(原諒我的筆記本比較舊,跟隨我多年了)。

如果在 d 每次賦值後,把 d 的值列印出來,如下面這樣:

d := (ilen - 1) / i

fmt.printf("%d, ", d)

可以發現 d 從某個值開始會出現重複,而且每個值重複的次數會越來越多。這就會造成非常多的重複操作,而這些操作還套著一重迴圈,這浪費了大量的執行時間。

發現問題,就可以解決問題。解決的辦法就是在 d 出現重複時記錄 d 的值,中止當前迴圈,進入到另乙個從 d-1 到 1 的迴圈,來完成後面的排序,這樣就可以有效的避免因 d 值重複在產生的大量重複操作。具體**如下:

func shellsort(list int) 

for j := 0; j+d < ilen; j++

}imark = d

}// 此處代替重複迴圈,可減少大量無用的迴圈判斷

for d := imark - 1; d > 0; d-- }}

}

測試結果如下:

output:

command-line-arguments

349.0199ms

經過多次測試顯示,同樣10萬個隨機數進行排序,執行時間都維持在350毫秒到400毫秒之間,優化的效果還是非常明顯的。

然後,還有一種寫法,效率最好,**如下:

func shellsort2(list int) }}

}

output:

command-line-arguments

43.0025ms

同樣10萬個隨機數排序,只需要45毫秒左右。

希爾排序法

一種算是優化的插入排序 一般是每次從半數之後的範圍進行插入,這樣可以減少總的交換量。達到快速的效果 但是最後一定要讓開始的位置變成1 也就是g陣列的最後乙個一定要是1 include using namespace std long long g 10000005 long long a 10000...

希爾排序法(縮小增量法)

2016 10 25 16 51 49 首先,要明白希爾排序法是什麼。它是一種改進版的直接插入法,它是將整個無序列分割成若干小的子串行分別進行插入排序的方法。1 include23 希爾排序法 4void shell sort int a,int n 5 intmain 614 shell sort...

Python希爾排序及優化

希爾排序 背景 插入排序在小規模資料 資料基本有序時效率較高 思想 將序列分為若干子串行進行插入排序,待序列基本有序時,對整體進行插入排序 分析 將序列以步長分組,組內資料進行插入排序 步長逐漸減小,執行上一步,直至步長為1 對整體進行插入排序 步長為1 def shell sort alist 希...