golang 歸并排序,快速排序,堆排序的實現(xiàn)
歸并排序
歸并排序使用經(jīng)典的分治法(Divide and conquer)策略。分治法會將問題分(divide)成一些小的問題然后遞歸求解,而治(conquer)的階段則將分的階段得到的各答案"修補"在一起,即分而治之。

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]進行快速排序的三個步驟為:
(1)分解:數(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下標是在劃分過程中計算得出的。
(2)解決:通過遞歸調(diào)用快速排序,對子數(shù)組A[p...q-1]和A[q+1...r]進行排序。
(3)合并:因為兩個子數(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 最后一個非葉子結點起開始構建大頂堆
for i := len(nums) / 2; i >= 0; i-- {
heapSort(nums, i)
}
end := len(nums) - 1
// 每次將大頂堆的最大值與末尾進行交換,并再次排序
for end > 0 {
nums[0], nums[end] = nums[end], nums[0]
heapSort(nums[:end], 0)
end--
}
return nums
}
// 對一個非葉子結點進行排序
func heapSort(nums []int, pos int) {
end := len(nums) - 1
left := 2 * pos + 1
if left > end {
return
}
right := 2 * pos + 2
temp := left
// 先左右子結點進行比較,找出較小的那一個
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ào)查交換了的后續(xù),不用全調(diào)查,不然會超時)
heapSort(nums, temp)
}
卑鄙排序

func sortArray(nums []int) []int {
sort.Ints(nums)
return nums
}
到此這篇關于golang 歸并排序,快速排序,堆排序的實現(xiàn)的文章就介紹到這了,更多相關golang 歸并排序,快速排序,堆排序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

