Go中切片排序的意外基准结果

我刚开始学习 golang 并决定实现一些基本的排序算法(冒泡排序、选择排序和插入排序)来尝试使用包、切片和测试基础设施。


这是实现:


package child_sort


func SortBubble(xs []int) {

    for i := range xs {

        swapped := false

        for j := 1; j < len(xs)-i; j++ {

            if xs[j-1] > xs[j] {

                xs[j-1], xs[j] = xs[j], xs[j-1]

                swapped = true

            }

        }

        if !swapped {

            break

        }

    }

}


func SortSelection(xs []int) {

    for i := range xs {

        min_i := i

        for j := i + 1; j < len(xs); j++ {

            if xs[j] < xs[min_i] {

                min_i = j

            }

        }

        if min_i != i {

            xs[i], xs[min_i] = xs[min_i], xs[i]

        }

    }

}


func SortInsertion(xs []int) {

    for i := 1; i < len(xs); i++ {

        for j := i; j > 0; j-- {

            if xs[j] < xs[j-1] {

                xs[j], xs[j-1] = xs[j-1], xs[j]

            }

        }

    }

}

单元测试似乎工作正常,但是当我为这些创建基准测试时,我得到了奇怪的结果,如下所示:


go test --bench . --benchmem 

PASS

BenchmarkBubble        1    2258469081 ns/op      241664 B/op          1 allocs/op

BenchmarkSelection  1000000000           0.60 ns/op        0 B/op          0 allocs/op

BenchmarkInsertion         1    1180026827 ns/op      241664 B/op          1 allocs/op

ok      .../go/src/child_sort   12.976s

困扰我的是选择排序几乎立即运行并产生零分配。如果我减小数组的大小,其他排序算法也会发生同样的事情。反之亦然,即如果我增加大小,选择排序开始正常运行。


不负相思意
浏览 185回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go