sort

在实际开发中,我们如何利用sort包,进行快速排序呢。

首先我们来看一下sort中最重要的一个接口:

sort #

type 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)
}

// 内部实现的四种排序算法
// 插入排序
func insertionSort(data Interface, a, b int)
// 堆排序
func heapSort(data Interface, a, b int)
// 快速排序
func quickSort(data Interface, a, b, maxDepth int)
// 归并排序
func symMerge(data Interface, a, m, b int)

一般我们利用下面三种方式进行排序:

定义一种类型实现sort.Interface #

// https://leetcode.cn/problems/non-overlapping-intervals/

import "sort"

func eraseOverlapIntervals(intervals [][]int) int {
    arr := _sort(intervals)
    tmp := arr[0]
    var ret int
    for i:=1; i< len(arr); i++{
        if tmp[1] > arr[i][0]{
            ret++
        }else{
            tmp = arr[i]
        }
    }
    return ret
}

func _sort(s [][]int)[][]int{
    sort.Sort(slice(s))
    return s
}

type slice [][]int
func (s slice)Len()int{
    return len(s) 
}

func (s slice)Swap(i, j int){
    s[i], s[j] = s[j], s[i]
}

func (s slice)Less(i, j int)bool{
   if s[i][1] < s[j][1]{
       return true
   }
   return false
}

预先定义好的函数 #

sort.Strings()
sort.Ints()
package main

import (
    "fmt"
    "sort"
)

func main() {

    strs := []string{"c", "a", "b"}
    sort.Strings(strs)
    fmt.Println("Strings:", strs)

    ints := []int{7, 2, 4}
    sort.Ints(ints)
    fmt.Println("Ints:   ", ints)

    s := sort.IntsAreSorted(ints)
    fmt.Println("Sorted: ", s)
}

使用Slice函数 #

sort.Slice(x any, less func(i, j int)bool)

Slice根据所提供的less函数对Slice x进行排序。如果x不是切片,它就会惊慌。 排序不保证是稳定的:相等的元素可以从它们原来的顺序颠倒过来。对于稳定排序,请使用SliceStable。 less函数必须满足与接口类型的less方法相同的要求。

func eraseOverlapIntervals(intervals [][]int) (res int) {
	sort.Slice(intervals, func(i, j int) bool {
		return intervals[i][1] < intervals[j][1]
	})
	curMax := intervals[0][1]
	for i := 1; i < len(intervals); i++ {
		if intervals[i][0] >= curMax {
			curMax = intervals[i][1]
		} else {
			res++
			if intervals[i][1] <= curMax {
				curMax = intervals[i][1]
			}
		}
	}
	return
}