Go之十大经典排序算法
生活随笔
收集整理的這篇文章主要介紹了
Go之十大经典排序算法
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
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.計(jì)數(shù)排序
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.基數(shù)排序
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問(wèn)題,思路:
a.先取前k個(gè)數(shù)建小根堆,這樣就能保證堆頂元素是整個(gè)堆的最小值;
b.然后遍歷列表的k到最后,如果值比堆頂大,就和堆頂交換,交換完后再對(duì)堆建小根堆,這樣就能保證交換完后,堆頂元素仍然是整個(gè)堆的最小值;
c.一直遍歷到列表的最后一個(gè)值,這一步做完之后,就保證了整個(gè)列表最大的前k個(gè)數(shù)已經(jīng)放進(jìn)了堆里;
d.按數(shù)的大到小出堆;
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] }?
轉(zhuǎn)載于:https://www.cnblogs.com/Coufusion/p/9804655.html
總結(jié)
以上是生活随笔為你收集整理的Go之十大经典排序算法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Django 之多对多关系
- 下一篇: spring cloud 定时任务