Golang升序

时间:2019-02-17 12:37:42

标签: go

我在这里有一个Go语言问题,与下面的代码相比,在编码Golang方面有没有更好的答案呢?

Mangkuk是由最大大小的Sudu组成的列表。 Sudu是连续整数的排列,可能带有重复项。

Cawan是Mangkuk,其中每个Sudu都按升序排序。 编写函数MakeCawan(→Mangkuk),将给定的Mangkuk排序为Cawan。

For example,
MakeCawan([21, 20, 18, 20, 18, 20, 19]),
MakeCawan([21, 2000000, 18, 20, 18, 20, 19]),
MakeCawan([21, 20, 18, 20, 18, 20, 1900000])
should produce, respectively,
[18, 18, 19, 20, 20, 20, 21],
[21, 2000000, 18, 18, 19, 20, 20],
[20, 21, 18, 20, 18, 20, 1900000].

package main

    import (
    	"fmt"
    	"sort"
    )

    func main() {
    	sl := []string{"MakeCawan"}
    	sort.Sort(sort.StringSlice(sl))
    	fmt.Println(sl)
    	
    	sl1 := []string{"MakeCawan"}
    	sort.Sort(sort.StringSlice(sl1))
    	fmt.Println(sl1)
    	
    	sl2 := []string{"MakeCawan"}
    	sort.Sort(sort.StringSlice(sl2))
    	fmt.Println(sl2)
    	
    	intSlice := []int{21,20,18,20,18,20,19}
    	sort.Sort(sort.IntSlice(intSlice))
    	fmt.Println(intSlice)

    }

输出:

https://play.golang.org/p/tsE0BtMRos_9

2 个答案:

答案 0 :(得分:0)

这个问题有些棘手:它不会要求您对整个切片进行排序(或用自己的术语对mangkuk进行排序);它要求您首先识别所有连续的间隔(可能有重复的元素),称为sudu,然后对每个sudu进行排序。

func makeCawan(mangkuk []int) []int {
    for now, n := 0, len(mangkuk); now < n; {
        min := mangkuk[now]
        max := min
        head := now
    loop:
        for now++; now < n; now++ {
            switch x := mangkuk[now]; {
            case x < min-1 || x > max+1:
                sort(mangkuk[head:now], min, max)
                break loop
            case x == min-1:
                min = x
            case x == max+1:
                max = x
            }
        }
        if now >= n {
            sort(mangkuk[head:now], min, max)
        }
    }

    return mangkuk
}

游乐场:https://play.golang.org/p/z3TGWnWnrVY

答案 1 :(得分:-1)

假设您要对连续且重复的int切片进行排序,请回答此问题。

简单地对切片进行排序是一种可读的解决方案,但是对于长度为n的切片,使用基于比较的排序算法将采用O(nlgn)。

我们可以在O(n)辅助空间上使用性能更好的算法。 算法:
 1.遍历数组A并找到min和max in。
 2.创建一个长度为max-min + 1的数组B。
 3.遍历A并将每个元素的计数存储在B中 即B[A[i] - min]++
 4.现在遍历B并打印i + min,B [i]次。

时间复杂度-O(n)

https://play.golang.org/p/rptgMpWdKCX

请注意,此循环也是O(n),其中n是实际输入数组的长度。

for i:=0;i<len(b);i++{
        for b[i] != 0{
            fmt.Printf("%v ", i + min)
            b[i]--
        }
    }