網站首頁 編程語言 正文
希爾排序
在插入排序中,在待排序序列的記錄個數比較少,而且基本有序,則排序的效率較高。
1959?年,Donald?Shell?從“減少記錄個數”?和 “基本有序”?兩個方面對直接插入排序進行了改進,提出了希爾排序算法。
希爾排序又稱為“縮小增量排序”。即將待排序記錄按下標的一定增量分組(減少記錄個數),對每組記錄使用直接插入排序算法排序(達到基本有序);
隨著增量逐漸減少,每組包含的關鍵詞越來越多,當增量減至1,整個序列基本有序,再對全部記錄進行一次直接插入排序。
算法思想
Shell 排序是一種高效的排序算法,基于插入排序算法。這種算法避免了插入排序中的大量移動,如果較小的值在最右邊,就必須移到最左邊。較小的值在最右邊,必須移到最左邊。
算法步驟:
- 設待排序的記錄存儲在數組
array[1...n]
? 中,增量序列為{g1, g2, ..., gt}
?,n>g1>g2>...>gt=1
?。 - 第一趟增量 g1, 所有間隔為 g1 的記錄分在一組,對每組記錄進行插入排序。
- 第二趟取增量 g2,所有間隔為 g2 的記錄分在一組,對每組記錄進行插入排序。
- 依次進行下去,直到所取增量 gt = 1,所有記錄在一組中進行插入排序。
圖解算法
假設我們有一個數組: [7, 4, 3, 5, 2, 1, 6]
:
第一次希爾排序間隔為3時:
第二次希爾排序間隔為2時:
第三次希爾排序間隔為1時:
Go 代碼實現:
package main import "fmt" func swap(array []int, a int, b int) { array[a] = array[a] + array[b] array[b] = array[a] - array[b] array[a] = array[a] - array[b] } func shellSort(array []int, length int) { for gap := length / 2; gap > 0; gap = gap / 2 { for i := gap; i < length; i++ { var j = i for { if j-gap < 0 || array[j] >= array[j-gap] { break } swap(array, j, j-gap) j = j - gap } } } } func main() { nums := []int{7, 4, 3, 5, 2, 1, 6} length := len(nums) shellSort(nums, length) for i := 0; i < length; i++ { fmt.Println(nums[i]) } }
運行結果:
[Running] go run "e:\Coding Workspaces\LearningGoTheEasiestWay\Go 數據結構\希爾排序\main.go"
1
2
3
4
5
6
7
總結
空間復雜度: 希爾排序在分組進行插入排序時使用了一個輔助空間 j
,空間復雜度為?O(1)O(1)O(1)
穩定性: 希爾排序的分組導致不同組間的相同數字可能會調換位置,所以希爾排序是不穩定的排序算法。
原文鏈接:https://juejin.cn/post/7043236708892016653
相關推薦
- 2022-04-17 python 提取出字符串括號中的內容
- 2022-04-24 記錄一次nginx啟動失敗的解決過程_nginx
- 2022-05-09 shell腳本編程Makefile的使用_linux shell
- 2022-06-30 詳解Go語言中泛型的實現原理與使用_Golang
- 2022-06-08 Python使用PyYAML庫讀寫yaml文件的方法_python
- 2022-04-21 Android?App頁面滑動標題欄顏色漸變詳解_Android
- 2022-04-17 WPF框架Prism中使用MVVM架構_實用技巧
- 2022-05-11 python?DataFrame的shift()方法的使用_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支