【Go算法速查】快速排序

71 阅读1分钟
package main

import "fmt"

func main() {
    var n int
    if err := input(&n); err != nil {
       return
    }
    arr := make([]int, n)
    for i := 0; i < n; i++ {
       if err := input(&arr[i]); err != nil {
          return
       }
    }
    quickSort(arr, 0, n - 1)
    for _, v := range arr {
       fmt.Printf("%d ", v)
    }
}


func quickSort(arr []int, l int, r int) {
    if l >= r {
       return
    }
    pivot := arr[(l + r) / 2]
    left, right := l, r
    for left <= right {
       for arr[left] < pivot {
          left++
       }
       for arr[right] > pivot {
          right--
       }
       if left <= right {
          arr[left], arr[right] = arr[right], arr[left]
          left++
          right--
       }
    }
    if right > l {
       quickSort(arr, l, right)
    }
    if left < r {
       quickSort(arr, left, r)
    }
}


// Take advantage of Go's slice feature, we don't need to pass the left and right index
func quickSort2(arr []int) {
    if len(arr) <= 1 {
       return
    }
    pivot := arr[len(arr)/2]
    left, right := 0, len(arr)-1
    for left <= right {
       for arr[left] < pivot {
          left++
       }
       for arr[right] > pivot {
          right--
       }
       if left <= right {
          arr[left], arr[right] = arr[right], arr[left]
          left++
          right--
       }
    }
    if right > 0 {
       quickSort2(arr[:right+1])
    }
    if left < len(arr) {
       quickSort2(arr[left:])
    }
}


func input(target *int) error {
    _, err := fmt.Scanf("%d", target)
    return err
}
  • quickSort2():利用 Go 语言 Slice 共享内存的特性,可省去 l,r 参数;