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ì)算得出的。
(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)起開(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)文章
關(guān)于Golang中range指針數(shù)據(jù)的坑詳解
這篇文章主要給大家介紹了關(guān)于Golang中range指針數(shù)據(jù)的坑的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-02-02Go語(yǔ)言執(zhí)行系統(tǒng)命令行命令的方法
這篇文章主要介紹了Go語(yǔ)言執(zhí)行系統(tǒng)命令行命令的方法,實(shí)例分析了Go語(yǔ)言操作系統(tǒng)命令行的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-02-02Golang?HTTP服務(wù)超時(shí)控制實(shí)現(xiàn)原理分析
這篇文章主要介紹了Golang?HTTP服務(wù)超時(shí)控制實(shí)現(xiàn)原理,HTTP服務(wù)的超時(shí)控制是保障服務(wù)高可用性的重要措施之一,由于HTTP服務(wù)可能會(huì)遇到網(wǎng)絡(luò)延遲,資源瓶頸等問(wèn)題,因此需要對(duì)請(qǐng)求進(jìn)行超時(shí)控制,以避免服務(wù)雪崩等問(wèn)題,需要的朋友可以參考下2023-05-05Go語(yǔ)言使用goroutine及通道實(shí)現(xiàn)并發(fā)詳解
這篇文章主要為大家介紹了Go語(yǔ)言使用goroutine及通道實(shí)現(xiàn)并發(fā)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08