为了账号安全,请及时绑定邮箱和手机立即绑定

Go 中的快速排序实现

Go 中的快速排序实现

Go
德玛西亚99 2021-09-10 15:26:58
我正在尝试在 go 中实现快速排序算法,仅用于学习目的。到目前为止,我想出了以下代码:package mainimport (    "fmt")var arr = []int{20, 43, 52, -1, 43, 29, 34}func main() {    fmt.Println("Unsorted: ", arr)    quick_sort(arr)    fmt.Println("Sorted: ", quick_sort(arr))}func quick_sort(arr []int) []int {    var recurse func(left int, right int)    var swap func(i int, j int)    var partition func(left int, right int, pivot int) int    swap = func(i int, j int) {        var temp = arr[i]        arr[i] = arr[j]        arr[j] = temp    }    partition = func(left int, right int, pivot int) int {        v := arr[pivot]        right--        swap(pivot, right)        for i := left; i < right; i++ {            // arr[i] doesn't seem to be updating here            fmt.Println(arr, left, right, i, arr[i], v)            if arr[i] <= v {                left++                swap(i, left)            }        }        swap(left, right)        return left    }    recurse = func(left int, right int) {        if left < right {            pivot := (right + left) / 2            pivot = partition(left, right, pivot)            recurse(left, pivot)            recurse(pivot+1, right)        }    }    recurse(0, len(arr))    return arr}它在 js 中就像一个魅力,但不知何故我无法让它在 go 中工作。出于某种原因,在我的分区函数中,在我的 for 循环中,arr[i]即使发生i变化, 的值也保持不变。我花了很多时间试图弄清楚我做错了什么,但我无法弄清楚。有没有人看到我遗漏的东西?
查看完整描述

1 回答

?
慕勒3428872

TA贡献1848条经验 获得超6个赞

left++应该在swap()函数之后如下


   if arr[i] <= v {         

        swap(i, left)

        left++

    }

修复后,输出为


Unsorted:  [20 43 52 -1 43 29 34]

Sorted:  [-1 20 29 34 43 43 52]


查看完整回答
反对 回复 2021-09-10
  • 1 回答
  • 0 关注
  • 161 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信