<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          golang實現(xiàn)桶排序

          共 1797字,需瀏覽 4分鐘

           ·

          2020-09-14 19:39

          本來這次是想分享一下跳表的go版本實現(xiàn),后來發(fā)現(xiàn)跳表的實現(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 main
          import "fmt"
          //實現(xiàn)排序排序func quickSort(nums []int, start, end int) []int { if start < end { i, j := start, end key := 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 := 0 for 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++ { //去掉一開始的tmp nums[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)}


          代碼示例結(jié)果:
          排序前:[45 63 3 1 29 77 20 4 30]排序后:[1 3 4 20 29 30 45 63 77]




          推薦閱讀



          學習交流 Go 語言,掃碼回復「進群」即可


          站長 polarisxu

          自己的原創(chuàng)文章

          不限于 Go 技術(shù)

          職場和創(chuàng)業(yè)經(jīng)驗


          Go語言中文網(wǎng)

          每天為你

          分享 Go 知識

          Go愛好者值得關(guān)注



          瀏覽 57
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  狠狠久 | 男女日逼视频网站 | 日日日亚洲| 午夜福利爱爱爱 | 大鸡巴综合网站 |