日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Go之十大经典排序算法

發布時間:2025/3/20 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Go之十大经典排序算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.冒泡排序

func bubble_sort(li []int) {for i := 0; i < len(li)-1; i++ {exchange := falsefor j := 0; j < len(li)-i-1; j++ {if li[j] > li[j+1] {li[j], li[j+1] = li[j+1], li[j]exchange = true}}if !exchange {return}} }

?

2.選擇排序

func select_sort(li []int) {for i := 0; i < len(li)-1; i++ {pos := ifor j := i + 1; j < len(li); j++ {if li[pos] > li[j] {pos = j}}li[i], li[pos] = li[pos], li[i]} }

?

3.插入排序

func insert_sort(li []int) {for i := 1; i < len(li); i++ {tmp := li[i]j := i - 1for j >= 0 && tmp < li[j] {li[j+1] = li[j]j --}li[j+1] = tmp} }

?

4.希爾排序

func shell_sort(li []int) {for gap := len(li) / 2; gap > 0; gap /= 2 {for i := gap; i < len(li); i++ {tmp := li[i]j := i - gapfor j >= 0 && tmp < li[j] {li[j+gap] = li[j]j -= gap}li[j+gap] = tmp}} }

?

5.快速排序

func quick_sort(li []int, left, right int) {if left >= right {return}i := leftj := rightrand.Seed(time.Now().Unix())r := rand.Intn(right-left) + leftli[i], li[r] = li[r], li[i]tmp := li[i]for i < j {for i < j && li[j] >= tmp {j--}li[i] = li[j]for i < j && li[i] <= tmp {i++}li[j] = li[i]}li[i] = tmpquick_sort(li, left, i-1)quick_sort(li, i+1, right) }

?

6.堆排序

func sift(li []int, low, high int) {i := lowj := 2*i + 1tmp:=li[i]for j <= high {if j < high && li[j] < li[j+1] {j++}if tmp < li[j] {li[i] = li[j]i = jj = 2*i + 1} else {break}}li[i] = tmp }func heap_sort(li []int) {for i := len(li)/2 - 1; i >= 0; i-- {sift(li, i, len(li)-1)}for j := len(li) - 1; j > 0; j-- {li[0], li[j] = li[j], li[0]sift(li, 0, j-1)} }

?

7.歸并排序

func merge(li []int, left, mid, right int) {i := leftj := mid + 1tmp := []int{}for i <= mid && j <= right {if li[i] <= li[j] {tmp = append(tmp, li[i])i ++} else {tmp = append(tmp, li[j])j ++}}if i <= mid {tmp = append(tmp, li[i:mid+1]...)} else {tmp = append(tmp, li[j:right+1]...)}for k := 0; k < len(tmp); k++ {li[left+k] = tmp[k]} }func merge_sort(li []int, left, right int) {if left < right {mid := (left + right) / 2merge_sort(li, left, mid)merge_sort(li, mid+1, right)merge(li, left, mid, right)} }

?

8.計數排序

func count_sort(li []int) {max_num := li[0]for i := 1; i < len(li); i++ {if max_num < li[i] {max_num = li[i]}}arr := make([]int, max_num+1)for j := 0; j < len(li); j++ {arr[li[j]]++}k := 0for m, n := range arr {for p := 0; p < n; p++ {li[k] = mk++}} }

?

9.桶排序

func bin_sort(li []int, bin_num int) {min_num, max_num := li[0], li[0]for i := 0; i < len(li); i++ {if min_num > li[i] {min_num = li[i]}if max_num < li[i] {max_num = li[i]}}bin := make([][]int, bin_num)for j := 0; j < len(li); j++ {n := (li[j] - min_num) / ((max_num - min_num + 1) / bin_num)bin[n] = append(bin[n], li[j])k := len(bin[n]) - 2for k >= 0 && li[j] < bin[n][k] {bin[n][k+1] = bin[n][k]k--}bin[n][k+1] = li[j]}o := 0for p, q := range bin {for t := 0; t < len(q); t++ {li[o] = bin[p][t]o++}} }

?

10.基數排序

func radix_sort(li []int) {max_num := li[0]for i := 0; i < len(li); i++ {if max_num < li[i] {max_num = li[i]}}for j := 0; j < len(strconv.Itoa(max_num)); j++ {bin := make([][]int, 10)for k := 0; k < len(li); k++ {n := li[k] / int(math.Pow(10, float64(j))) % 10bin[n] = append(bin[n], li[k])}m := 0for p := 0; p < len(bin); p++ {for q := 0; q < len(bin[p]); q++ {li[m] = bin[p][q]m++}}} }

?

11.用堆排解決top_k問題,思路:

  a.先取前k個數建小根堆,這樣就能保證堆頂元素是整個堆的最小值;

  b.然后遍歷列表的k到最后,如果值比堆頂大,就和堆頂交換,交換完后再對堆建小根堆,這樣就能保證交換完后,堆頂元素仍然是整個堆的最小值;

  c.一直遍歷到列表的最后一個值,這一步做完之后,就保證了整個列表最大的前k個數已經放進了堆里;

  d.按數的大到小出堆;

func sift(li []int, low, high int) {i := lowj := 2*i + 1tmp := li[i]for j <= high {if j < high && li[j] > li[j+1] {j++}if tmp > li[j] {li[i] = li[j]i = jj = 2*i + 1} else {break}}li[i] = tmp }func top_k(li []int, k int) []int {for i := k/2 - 1; i >= 0; i-- {sift(li, i, k-1)}for j := k; j < len(li); j++ {if li[0] < li[j] {li[0], li[j] = li[j], li[0]sift(li, 0, k-1)}}for n := k - 1; n > 0; n-- {li[0], li[n] = li[n], li[0]sift(li, 0, n-1)}return li[:k] }

?

轉載于:https://www.cnblogs.com/Coufusion/p/9804655.html

總結

以上是生活随笔為你收集整理的Go之十大经典排序算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。