go - Go 中惯用的快速排序

标签 go quicksort

我正在研究 Go,并试图找到经典算法的惯用实现来感受这门语言。

我选择快速排序是因为我对数组与 slice 、就地与复制处理特别感兴趣。在我确定了一些概念之后,我想写一个并行实现。

谁能告诉我在 Go 中快速排序的惯用实现?

最佳答案

好吧,我最终得到了这个。我对 Go 的了解还不足以说它是地道的,但我使用了 slice 、单行交换和一个 range 子句。这篇文章对我来说非常有用,所以我想我应该分享一下。

func qsort(a []int) []int {
  if len(a) < 2 { return a }

  left, right := 0, len(a) - 1

  // Pick a pivot
  pivotIndex := rand.Int() % len(a)

  // Move the pivot to the right
  a[pivotIndex], a[right] = a[right], a[pivotIndex]

  // Pile elements smaller than the pivot on the left
  for i := range a {
    if a[i] < a[right] {
      a[i], a[left] = a[left], a[i]
      left++
    }
  }

  // Place the pivot after the last smaller element
  a[left], a[right] = a[right], a[left]

  // Go down the rabbit hole
  qsort(a[:left])
  qsort(a[left + 1:])


  return a
}

关于go - Go 中惯用的快速排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15802890/

相关文章:

io - 中止来自另一个 goroutine 的 Read() 调用

python - 如何在我的快速排序算法中获得输出

java - 为什么 java.util.Arrays 使用两种排序算法?

go - 停止使用上下文执行简单功能

go - 如何解决与现有 child 的问题冲突?

go - 在 golang 中,如果其中一个方法必须具有指针接收器,是否有必要将一种类型的所有方法更改为具有指针接收器?

java - 如何在Java中的快速排序中计算比较和交换?

c - 算法 - 快速排序的实现问题

algorithm - 哪一个快速排序试运行是正确的?使困惑

arrays - Go语言中的结构体数组