简体   繁体   English

Go中的Quicksort实施

[英]Quicksort implementation in Go

I am trying to implement a quicksort algorithm in go just for learning purposes. 我正在尝试仅出于学习目的而实施快速排序算法。

So far I have come up with the following code: 到目前为止,我已经提出了以下代码:

package main

import (
    "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
}

This is a direct translation of a code I had previously written in javascript: 这是我以前用javascript编写的代码的直接翻译:

  function quick_sort(arr) {

  function partition(left, right, pivot) {
    var v = arr[pivot];
    swap(pivot, --right);

    for (var i = left;  i < right; i ++) {
      console.log(arr, left, right, i, arr[i], v);
      if (arr[i] <= v) {
        swap(i, left++);
      }
    }
    swap(left, right);

    return left;
  }

  function swap(i, j) {
    var temp = arr[i];

    arr[i] = arr[j];
    arr[j] = temp;
  }

  function recurse(left, right) {
    if (left < right) {
      var pivot = ~~((left + right) / 2)
      pivot = partition(left, right, pivot);
      recurse(left, pivot);
      recurse(pivot + 1, right);
    }
  }

  recurse(0, arr.length)
  return arr;
}

var arr = [20, 43, 52, -1, 43, 29, 34];

console.log(quick_sort(arr));

It works like a charm in js, but somehow I cannot get it to work in go. 它像js中的魅力一样工作,但是以某种方式我无法使其正常运行。 For some reason, in my partition function, in my for loop, the value of arr[i] remains constant even when i is changing. 由于某种原因,在我的分区函数中,在我的for循环中,即使当i更改时, arr[i]值也保持恒定。

I have spent quite a lot of time trying to figure out what I am doing wrong but I couldn't figure it out. 我花了很多时间试图找出我做错了什么,但我无法弄清楚。

Does anyone see something I'm missing? 有人看到我想念的东西吗?

left++ should be after the swap() function as follow left++应该在swap()函数之后,如下所示

   if arr[i] <= v {         
        swap(i, left)
        left++
    }

After the fix, output is 修复后,输出为

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM