ホームページ >バックエンド開発 >Golang >golangでのソートの使用について

golangでのソートの使用について

藏色散人
藏色散人転載
2020-10-10 14:59:302695ブラウズ

次のコラム golang チュートリアル では、golang の並べ替えと使い方について紹介します。困っている友人の役に立てば幸いです。

golangでのソートの使用について

Golang 標準ライブラリは、整数などの一般的に使用される多くの並べ替えメソッドを実装しています。シーケンスの並べ替え: sort.Ints(),
では、カスタム データ構造を並べ替える場合はどうすればよいでしょうか?
たとえば、ユーザーのリストの場合、ポイント順に並べ替えます:

最初にデータ構造を定義します。問題を明確に説明するために、フィールドは 2 つだけ指定します。

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

golang でソートをカスタマイズしたい場合は、独自の構造に 3 つのメソッドを実装する必要があります:

// 摘自: $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)}

このデザインは素晴らしいですね。私たちのソートについて考えてみましょう。長さ、比率のサイズ、要素の交換など、すべてにシーケンスが必要です。
golang を使用して上記の Users、つまりユーザーリストを並べ替えるにはどうすればよいですか?

まず、記述どおりにこれら 3 つのメソッドを実装します:

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) だけが必要です。

概要:

    カスタム シーケンスでは、Less、Swap、Len の 3 つのメソッドを実装する必要があります。
追加および修正を歓迎します。

以上がgolangでのソートの使用についての詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。