golang實現(xiàn)桶排序
計數(shù)排序的優(yōu)化版本,用有限數(shù)量的桶存放數(shù)據(jù)(存放規(guī)則由自定義函數(shù)來確定),對每個桶進行排序。
每個桶中的數(shù)包含在一個范圍,桶排序是對數(shù)據(jù)進行了區(qū)域劃分,然后對每個區(qū)域內(nèi)的數(shù)據(jù)進行排序,然后依次輸出。
初始狀態(tài)下,整個序列R[1,2,……,n]處于無序狀態(tài),且大小在[a,a+k]范圍內(nèi)
設(shè)置桶的數(shù)量為bucketNum,則數(shù)據(jù)可以劃分為[0,bucketNum]、[bucketNum,2*bucketNum-1]、……、[n*(bucketNum-1)/bucketNum,n],數(shù)組中數(shù)據(jù)分別分配到相應(yīng)桶中
再對每個非空桶中的元素進行排序
所有的非空桶依次合并即得到排序好的數(shù)據(jù)
1. 時間復雜度:遍歷序列O(n),因此桶排序耗時主要取決于每個桶排序用時O(k),總共耗時O(n+k)
2. 穩(wěn)定性:桶排序是穩(wěn)定的,相同數(shù)的順序沒有改變。
下面是實現(xiàn)代碼,大家有興趣簡單瀏覽一下
package mainimport "fmt"//實現(xiàn)排序排序func quickSort(nums []int, start, end int) []int {if start < end {i, j := start, endkey := nums[(start+end)/2]for i <= j {for nums[i] < key {i++}for nums[j] > key {j--}if i <= j {nums[i], nums[j] = nums[j], nums[i]i++j--}}if start < j {nums = quickSort(nums, start, j)}if end > i {nums = quickSort(nums, i, end)}}return nums}func bucketSort(nums []int, bucketNum int) []int {bucket := [][]int{}for i := 0; i < bucketNum; i++ {tmp := make([]int, 1)bucket = append(bucket, tmp)}//將數(shù)據(jù)分配到桶中for i := 0; i < len(nums); i++ {bucket[nums[i]/bucketNum] = append(bucket[nums[i]/bucketNum], nums[i])}//循環(huán)所有的桶進行排序index := 0for i := 0; i < bucketNum; i++ {if len(bucket[i]) > 1 {//對每個桶內(nèi)部進行排序,使用快排bucket[i] = quickSort(bucket[i], 0, len(bucket[i])-1)for j := 1; j < len(bucket[i]); j++ { //去掉一開始的tmpnums[index] = bucket[i][j]index++}}}return nums}func main() {nums := []int{45, 63, 3, 1, 29, 77, 20, 4, 30}fmt.Println("排序前:")fmt.Println(nums)nums = bucketSort(nums, 20)fmt.Println("排序后:")fmt.Println(nums)}
排序前:[]排序后:[]
推薦閱讀
站長 polarisxu
自己的原創(chuàng)文章
不限于 Go 技術(shù)
職場和創(chuàng)業(yè)經(jīng)驗
Go語言中文網(wǎng)
每天為你
分享 Go 知識
Go愛好者值得關(guān)注
評論
圖片
表情
