網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
歸并排序
歸并排序使用經(jīng)典的分治法(Divide and conquer)策略。分治法會(huì)將問(wèn)題分(divide)成一些小的問(wèn)題然后遞歸求解,而治(conquer)的階段則將分的階段得到的各答案"修補(bǔ)"在一起,即分而治之。
func sortArray(nums []int) []int { if len(nums) <= 1 { return nums } partA := sortArray(nums[:len(nums)/2]) partB := sortArray(nums[len(nums)/2:]) temp := make([]int, len(partA) + len(partB)) aPointer := 0 bPointer := 0 i := 0 for aPointer < len(partA) && bPointer < len(partB) { if partA[aPointer] < partB[bPointer] { temp[i] = partA[aPointer] aPointer++ } else { temp[i] = partB[bPointer] bPointer++ } i++ } for aPointer < len(partA) { temp[i] = partA[aPointer] aPointer++ i++ } for bPointer < len(partB) { temp[i] = partB[bPointer] bPointer++ i++ } return temp }
快速排序
快速排序算法采用的分治算法,因此對(duì)一個(gè)子數(shù)組A[p…r]進(jìn)行快速排序的三個(gè)步驟為:
(1)分解:數(shù)組A[p...r]被劃分為兩個(gè)(可能為空)子數(shù)組A[p...q-1]和A[q+1...r],給定一個(gè)樞軸,使得A[p...q-1]中的每個(gè)元素小于等于A[q],A[q+1...r]中的每個(gè)元素大于等于A[q],q下標(biāo)是在劃分過(guò)程中計(jì)算得出的。
(2)解決:通過(guò)遞歸調(diào)用快速排序,對(duì)子數(shù)組A[p...q-1]和A[q+1...r]進(jìn)行排序。
(3)合并:因?yàn)閮蓚€(gè)子數(shù)組是就地排序,不需要合并操作,整個(gè)數(shù)組A[p…r]排序完成。
func sortArray(nums []int) []int { quickSort(nums) return nums } func quickSort(nums []int) { left, right := 0, len(nums) - 1 for right > left { // 右邊部分放大于 if nums[right] > nums[0] { right-- continue } // 左邊部分放小于等于 if nums[left] <= nums[0] { left++ continue } nums[left], nums[right] = nums[right], nums[left] } nums[0], nums[right] = nums[right], nums[0] if len(nums[:right]) > 1 { sortArray(nums[:right]) } if len(nums[right + 1:]) > 1 { sortArray(nums[right + 1:]) } }
堆排序
func sortArray(nums []int) []int { // 從n/2 最后一個(gè)非葉子結(jié)點(diǎn)起開始構(gòu)建大頂堆 for i := len(nums) / 2; i >= 0; i-- { heapSort(nums, i) } end := len(nums) - 1 // 每次將大頂堆的最大值與末尾進(jìn)行交換,并再次排序 for end > 0 { nums[0], nums[end] = nums[end], nums[0] heapSort(nums[:end], 0) end-- } return nums } // 對(duì)一個(gè)非葉子結(jié)點(diǎn)進(jìn)行排序 func heapSort(nums []int, pos int) { end := len(nums) - 1 left := 2 * pos + 1 if left > end { return } right := 2 * pos + 2 temp := left // 先左右子結(jié)點(diǎn)進(jìn)行比較,找出較小的那一個(gè) if right <= end && nums[right] > nums[temp] { temp = right } if nums[temp] <= nums[pos] { return } nums[temp], nums[pos] = nums[pos], nums[temp] // 如果發(fā)生了交換的話 就要繼續(xù)調(diào)查后續(xù)子節(jié)點(diǎn)(只調(diào)查交換了的后續(xù),不用全調(diào)查,不然會(huì)超時(shí)) heapSort(nums, temp) }
卑鄙排序
func sortArray(nums []int) []int { sort.Ints(nums) return nums }
原文鏈接:https://blog.csdn.net/weixin_40486544/article/details/104312428
相關(guān)推薦
- 2021-11-06 C/C++?Qt?StringListModel?字符串列表映射組件詳解_C 語(yǔ)言
- 2022-07-09 Python小技巧練習(xí)分享_python
- 2023-03-04 Python使用yaml模塊操作YAML文檔的方法_python
- 2022-10-14 C++ STL - list 模擬實(shí)現(xiàn)+解析迭代器
- 2021-12-02 golang配制高性能sql.DB的使用_Golang
- 2022-04-30 Winform項(xiàng)目中TextBox控件DataBindings屬性_C#教程
- 2022-12-13 python辦公自動(dòng)化(Excel)的實(shí)例教程_python
- 2022-10-20 Android?PowerManagerService省電模式策略控制_Android
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支