golang 歸并排序,快速排序,堆排序的實(shí)現(xiàn)
歸并排序
歸并排序使用經(jīng)典的分治法(Divide and conquer)策略。分治法會將問題分(divide)成一些小的問題然后遞歸求解,而治(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 }
快速排序
快速排序算法采用的分治算法,因此對一個子數(shù)組A[p…r]進(jìn)行快速排序的三個步驟為:
?。?)分解:數(shù)組A[p...r]被劃分為兩個(可能為空)子數(shù)組A[p...q-1]和A[q+1...r],給定一個樞軸,使得A[p...q-1]中的每個元素小于等于A[q],A[q+1...r]中的每個元素大于等于A[q],q下標(biāo)是在劃分過程中計(jì)算得出的。
?。?)解決:通過遞歸調(diào)用快速排序,對子數(shù)組A[p...q-1]和A[q+1...r]進(jìn)行排序。
(3)合并:因?yàn)閮蓚€子數(shù)組是就地排序,不需要合并操作,整個數(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 最后一個非葉子結(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 } // 對一個非葉子結(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)行比較,找出較小的那一個 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)查,不然會超時) heapSort(nums, temp) }
卑鄙排序
func sortArray(nums []int) []int { sort.Ints(nums) return nums }
到此這篇關(guān)于golang 歸并排序,快速排序,堆排序的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)golang 歸并排序,快速排序,堆排序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于Golang中range指針數(shù)據(jù)的坑詳解
這篇文章主要給大家介紹了關(guān)于Golang中range指針數(shù)據(jù)的坑的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-02-02Golang?HTTP服務(wù)超時控制實(shí)現(xiàn)原理分析
這篇文章主要介紹了Golang?HTTP服務(wù)超時控制實(shí)現(xiàn)原理,HTTP服務(wù)的超時控制是保障服務(wù)高可用性的重要措施之一,由于HTTP服務(wù)可能會遇到網(wǎng)絡(luò)延遲,資源瓶頸等問題,因此需要對請求進(jìn)行超時控制,以避免服務(wù)雪崩等問題,需要的朋友可以參考下2023-05-05Go語言使用goroutine及通道實(shí)現(xiàn)并發(fā)詳解
這篇文章主要為大家介紹了Go語言使用goroutine及通道實(shí)現(xiàn)并發(fā)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08