国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Golang > 正文

go語言中排序sort的使用方法示例

2020-04-01 18:56:57
字體:
供稿:網(wǎng)友

前言

sort包中實現(xiàn)了3種基本的排序算法:插入排序.快排和堆排序.和其他語言中一樣,這三種方式都是不公開的,他們只在sort包內(nèi)部使用.所以用戶在使用sort包進行排序時無需考慮使用那種排序方式,sort.Interface定義的三個方法:獲取數(shù)據(jù)集合長度的Len()方法、比較兩個元素大小的Less()方法和交換兩個元素位置的Swap()方法,就可以順利對數(shù)據(jù)集合進行排序。sort包會根據(jù)實際數(shù)據(jù)自動選擇高效的排序算法。

已知一個的struct組成的數(shù)組,現(xiàn)在要按照數(shù)組中的一個字段排序。python有sort方法,那golang要怎么實現(xiàn)呢?其實golang也有sort方法,并且使用簡單,功能強大。

方法如下:

我們先看一下sort.Sort()的源碼

func Sort(data Interface) {  // Switch to heapsort if depth of 2*ceil(lg(n+1)) is reached.  n := data.Len()  maxDepth := 0  for i := n; i > 0; i >>= 1 {    maxDepth++  }  maxDepth *= 2  quickSort(data, 0, n, maxDepth)} func quickSort(data Interface, a, b, maxDepth int) {  for b-a > 12 { // Use ShellSort for slices <= 12 elements    if maxDepth == 0 {      heapSort(data, a, b)      return    }    maxDepth--    mlo, mhi := doPivot(data, a, b)    // Avoiding recursion on the larger subproblem guarantees    // a stack depth of at most lg(b-a).    if mlo-a < b-mhi {      quickSort(data, a, mlo, maxDepth)      a = mhi // i.e., quickSort(data, mhi, b)    } else {      quickSort(data, mhi, b, maxDepth)      b = mlo // i.e., quickSort(data, a, mlo)    }  }  if b-a > 1 {    // Do ShellSort pass with gap 6    // It could be written in this simplified form cause b-a <= 12    for i := a + 6; i < b; i++ {      if data.Less(i, i-6) {        data.Swap(i, i-6)      }    }    insertionSort(data, a, b)  }}

通過quickSort方法我們看出,根據(jù)數(shù)據(jù)不同的狀況,quickSort會選擇堆排,快排,插入排中更高效的排序方法,這個我們暫時先不深究,先看如何使用sort.Sort() 

從源碼中我們發(fā)現(xiàn)數(shù)據(jù)data,需要自帶Len,Less,Swap三種方法,所以使用sort.Sort()前,我們需要自己實現(xiàn)Len,Less,Swap來確定按照什么規(guī)則排序。

來實踐一下,我們先創(chuàng)建一個結(jié)構體數(shù)組,結(jié)構體包含字段Count,我們按照Count對其排序。

package main import (  "sort" ) type subInfo struct {  Count uint  `json:"count"`} type SubList []*subInfo func (p SubList) Swap(i, j int)   { p[i], p[j] = p[j], p[i] }func (p SubList) Len() int      { return len(p) }func (p SubList) Less(i, j int) bool { return p[i].Count > p[j].Count } func main() {  st_list := SubList{}  for i := 0; i < 10; i ++{    _sub := &subInfo{      Count: uint(i),    }    st_list = append(st_list, _sub)  }  sort.Sort(st_list)  return}

需要注意的是,st_list只能初始化成SubList{} ,而不能初始化為make([]*subInfo, 0) ,雖然他們結(jié)構是一樣的。

最近諸事不順,心煩的一匹,上周也拖更了,總之希望大家事事順心,心愛的人身體健康。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網(wǎng)的支持。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 奉新县| 广河县| 东乌珠穆沁旗| 阳泉市| 长白| 武川县| 墨玉县| 大理市| 合川市| 寻乌县| 积石山| 新安县| 台中市| 铁岭县| 麟游县| 石渠县| 凤冈县| 呼玛县| 清徐县| 吉木萨尔县| 毕节市| 双桥区| 山东省| 正宁县| 灵武市| 上虞市| 临漳县| 贵州省| 红原县| 江安县| 孟津县| 德兴市| 响水县| 双鸭山市| 敦化市| 苏尼特左旗| 铁岭市| 潜江市| 兴安盟| 和政县| 中卫市|