希爾排序法的**實現:
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:經過多次測試,10萬個隨機數排序所需要的時間基本都維持在25秒左右(原諒我的筆記本比較舊,跟隨我多年了)。command-line-arguments
24.0993784s
如果在 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:經過多次測試顯示,同樣10萬個隨機數進行排序,執行時間都維持在350毫秒到400毫秒之間,優化的效果還是非常明顯的。command-line-arguments
349.0199ms
然後,還有一種寫法,效率最好,**如下:
func shellsort2(list int) }}
}
output:同樣10萬個隨機數排序,只需要45毫秒左右。command-line-arguments
43.0025ms
希爾排序法
一種算是優化的插入排序 一般是每次從半數之後的範圍進行插入,這樣可以減少總的交換量。達到快速的效果 但是最後一定要讓開始的位置變成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 希...