go使现快速排序
package main
/*
Go实现快速排序算法
思路:
在数组中取出一个元素作为基准值,把其它元素分为两组:
“大的”是那些大于基准值的元素,“小的”是那些小于基准值的元素,
递归对这两组做排序。
快排快速的原因:
一旦知道了某个元素比基准值小,它就不需要与那些大的元素比较。
而大的元素也不需要与小的元素比较。
原理解析:
http://blog.csdn.net/yzllz001/article/details/50982841
*/
import (
"fmt"
)
// 交换数组中两个数的位置
func Swap(array []int, i int, j int) {
var tmp = array[i]
array[i] = array[j]
array[j] = tmp
}
// 方法1, 这种写法看起来代码有点多
func QuickSort(array []int, left int, right int) {
if left >= right {
return
}
temp := array[left] //temp中存的就是基准数
i := left
j := right
for ; i !=j; {
for ; (array[j] >= temp && i<j); {
j--
}
for ; (array[i] <= temp && i<j); {
i++
}
if i < j {
Swap(array, i, j)
}
}
Swap(array, left, i) //最终将基准数归位
QuickSort(array, left, i-1) //继续处理左边的,这里是一个递归的过程
QuickSort(array, i+1, right) //继续处理右边的,这里是一个递归的过程
}
// 方法2, 比较简单,推荐
func QuickSort2(array []int, left int, right int) {
if left > right {
return
}
last := left
for i:=left+1; i<=right; i++ {
if array[i] < array[left] { // 从小到大排序
last++
array[i],arr[last] = array[last],arr[i]
}
}
array[left], array[last] = array[last], array[left]
QuickSort2(array, left, last-1) //继续处理左边的,这里是一个递归的过程
QuickSort2(array, last+1, right) //继续处理右边的,这里是一个递归的过程
}
func main() {
ary := []int{9,3,10,4,5,7,6,8,1,2}
fmt.Printf("排序前为%v\n", ary)
QuickSort2(ary, 0, 9)
fmt.Printf("排序后为%v\n", ary)
}
输出:
排序前为[9 3 10 4 5 7 6 8 1 2]
排序后为[1 2 3 4 5 6 7 8 9 10]