Heim  >  Artikel  >  Backend-Entwicklung  >  Über die Verwendung der Sortierung in Golang

Über die Verwendung der Sortierung in Golang

藏色散人
藏色散人nach vorne
2020-10-10 14:59:302665Durchsuche

Die folgende Kolumne stellt die Sortierung und Verwendung von Golang aus der Kolumne Golang-Tutorial vor. Ich hoffe, dass sie Freunden in Not hilfreich sein wird!

Über die Verwendung der Sortierung in Golang

Die Golang-Standardbibliothek implementiert viele gängige Sortiermethoden, z. B. das Sortieren von Ganzzahlfolgen: sort.Ints(),
Dann, wenn Sie wie sortieren um die definierte Datenstruktur zu sortieren?
Sortieren Sie beispielsweise eine Liste von Benutzern nach ihren Punkten: sort.Ints()
那么如果对自定义的数据结构排序怎么做呢?
比如对一个用户列表,按他们的积分排序:

首先定义数据结构,为了能清楚说明问题,只给两个字段。

type User struct {
	Name  string
	Score int}type Users []User

golang中想要自定义排序,自己的结构要实现三个方法:

// 摘自: $GOROOT/src/sort/sort.gotype Interface interface {
	// Len is the number of elements in the collection.
	Len() int
	// Less reports whether the element with
	// index i should sort before the element with index j.
	Less(i, j int) bool
	// Swap swaps the elements with indexes i and j.
	Swap(i, j int)}

这个设计太妙了有没有,想想我们学过的排序,都要序列长度,比大小,交换元素。
那对上述的Users,也就是用户列表如何使用golang的排序呢?

先按它说的,实现这三个方法:

func (us Users) Len() int {
	return len(us)}func (us Users) Less(i, j int) bool {
	return us[i].Score < us[j].Score}func (us Users) Swap(i, j int) {
	us[i], us[j] = us[j], us[i]}

然后就能排序了:

func main() {
	var us Users	const N = 6

	for i := 0; i < N; i++ {
		us = append(us, User{
			Name:  "user" + strconv.Itoa(i),
			Score: rand.Intn(N * N),
		})
	}

	fmt.Printf("%v\n", us)
	sort.Sort(us)
	fmt.Printf("%v\n", us)}

可能的输出为:

[{user0 5} {user1 15} {user2 11} {user3 11} {user4 13} {user5 6}]
[{user0 5} {user5 6} {user2 11} {user3 11} {user4 13} {user1 15}]

可以看到,分数从小到大排列了。

不过一般我们积分这种东西都是从大到小排序的,只需将
sort.Sort(us)改成sort.Sort(sort.Reverse(us))就行。

确实很方便。

当然,如果出于特殊需要,系统提供的排序不能满足我们的需要,
还是可以自己实现排序的, 比如针对上述,自己来排序(从小到大):

func myqsort(us []User, lo, hi int) {
	if lo < hi {
		pivot := partition(us, lo, hi)
		myqsort(us, lo, pivot-1)
		myqsort(us, pivot+1, hi)
	}}func partition(us []User, lo, hi int) int {
	tmp := us[lo]
	for lo < hi {
		for lo < hi && us[hi].Score >= tmp.Score {
			hi--
		}
		us[lo] = us[hi]

		for lo < hi && us[lo].Score <= tmp.Score {
			lo++
		}
		us[hi] = us[lo]
	}
	us[lo] = tmp	return hi}

一个简单的快速排序,调用时只需要myqsort(us)

Definieren Sie zunächst die Datenstruktur. Um das Problem klar zu erklären, werden nur zwei Felder angegeben.

rrreee

Wenn Sie die Sortierung in Golang anpassen möchten, müssen Sie drei Methoden in Ihrer eigenen Struktur implementieren:
    rrreee
  • Dieses Design ist wunderbar, nicht wahr? Denken Sie an die Sortierung, die wir gelernt haben und die Sequenzlänge und Verhältnis erfordert und Austausch von Elementen.
    Wie sortiere ich mit Golang die oben genannten Benutzer, also die Benutzerliste?
Implementieren Sie zuerst diese drei Methoden wie es heißt:

rrreee

Dann können Sie sortieren: rrreeeDie mögliche Ausgabe ist: 🎜
🎜[{user0 5} {user1 15} {user2 11} { user3 11} { user4 13} {user5 6}]
[{user0 5} {user5 6} {user2 11} {user3 11} {user4 13} {user1 15}]🎜
🎜Sie können sich hier das ansehen Die Partituren sind vom kleinsten zum größten sortiert. 🎜🎜Aber im Allgemeinen sortieren wir Dinge wie Punkte von groß nach klein, ändern Sie einfach
sort.Sort(us) in sort.Sort(sort.Reverse (us)) code> reicht aus. 🎜🎜Es ist wirklich praktisch. 🎜🎜Wenn die vom System bereitgestellte Sortierung aufgrund besonderer Bedürfnisse unsere Anforderungen nicht erfüllen kann, können wir die Sortierung beispielsweise trotzdem selbst durchführen (von klein bis). groß): 🎜rrreee🎜Ein einfaches Zum schnellen Sortieren benötigen Sie beim Aufruf nur <code>myqsort(us). 🎜🎜Zusammenfassung: 🎜🎜🎜 Benutzerdefinierte Sequenzen müssen die drei Methoden Less, Swap und Len implementieren🎜🎜🎜Willkommen zum Hinzufügen und Korrigieren! 🎜🎜🎜

Das obige ist der detaillierte Inhalt vonÜber die Verwendung der Sortierung in Golang. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen