golang 歸并排序,快速排序,堆排序的實(shí)現(xiàn)
歸并排序
歸并排序使用經(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è)步驟為:
?。?)分解:數(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ì)算得出的。
?。?)解決:通過(guò)遞歸調(diào)用快速排序,對(duì)子數(shù)組A[p...q-1]和A[q+1...r]進(jìn)行排序。
?。?)合并:因?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)起開(kāi)始構(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
}
到此這篇關(guān)于golang 歸并排序,快速排序,堆排序的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)golang 歸并排序,快速排序,堆排序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
GoLang基礎(chǔ)學(xué)習(xí)之go?test測(cè)試
相信每位編程開(kāi)發(fā)者們應(yīng)該都知道,Golang作為一門標(biāo)榜工程化的語(yǔ)言,提供了非常簡(jiǎn)便、實(shí)用的編寫單元測(cè)試的能力,下面這篇文章主要給大家介紹了關(guān)于GoLang基礎(chǔ)學(xué)習(xí)之go?test測(cè)試的相關(guān)資料,需要的朋友可以參考下2022-08-08
深入解析Go語(yǔ)言編程中slice切片結(jié)構(gòu)
這篇文章主要介紹了Go語(yǔ)言編程中slice切片結(jié)構(gòu),其中Append方法的用法介紹較為詳細(xì),需要的朋友可以參考下2015-10-10
創(chuàng)建第一個(gè)Go語(yǔ)言程序Hello,Go!
這篇文章主要介紹了創(chuàng)建第一個(gè)Go語(yǔ)言程序Hello,Go!本文詳細(xì)的給出項(xiàng)目創(chuàng)建、代碼編寫的過(guò)程,同時(shí)講解了GOPATH、Go install等內(nèi)容,需要的朋友可以參考下2014-10-10
使用pprof分析golang內(nèi)存泄露問(wèn)題及解決
這篇文章主要介紹了使用pprof分析golang內(nèi)存泄露問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-04-04

