快速排序
快速排序算法的主要流程是
1、数列中挑出一个元素,称为”基准”,基准可以为序列中任意元素,一般取序列第1个元素
2、重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(相同的数可以到任何一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
3、递归地把拆分的两个子序列进行排序。
package main
import (
"fmt"
"math/rand"
"time"
)
func RandArray(num int) []int {
arr := make([]int, num)
//以当前时间为随机数种子
rand.Seed(time.Now().Unix())
for i := 0; i < num; i++ {
arr[i] = rand.Intn(100)
}
return arr
}
//来源于WIKI 网站
func quic_wiki(data []int) []int {
if len(data) <= 1 {
return data
}
mid := data[0]
head, tail := 0, len(data)-1
for i := 1; i <= tail; {
if data[i] > mid {
data[i], data[tail] = data[tail], data[i]
tail--
} else {
data[i], data[head] = data[head], data[i]
head++
i++
}
}
data[head] = mid
quic_wiki(data[:head])
quic_wiki(data[head+1:])
return data
}
func quick_sort(arr []int) []int {
if len(arr) <= 1 {
return arr
}
median := arr[rand.Intn(len(arr))]
//fmt.Printf("par: %v\n", median)
low_part := make([]int, 0, len(arr))
high_part := make([]int, 0, len(arr))
middle_part := make([]int, 0, len(arr))
for _, item := range arr {
switch {
case item < median:
low_part = append(low_part, item)
case item == median:
middle_part = append(middle_part, item)
case item > median:
high_part = append(high_part, item)
}
}
low_part = quick_sort(low_part)
high_part = quick_sort(high_part)
low_part = append(low_part, middle_part...)
low_part = append(low_part, high_part...)
return low_part
}
func main() {
fmt.Println("Quick sort algorithm \n")
arr := RandArray(13)
fmt.Println("Initial array is:", arr)
fmt.Println("")
fmt.Println(" wiki Sorted array is: ", quic_wiki(arr))
fmt.Println("")
fmt.Println(" others Sorted array is: ", quick_sort(arr))
}
输出结果:
第一次:
Quick sort algorithm
Initial array is: [53 18 68 0 98 90 26 60 72 66 69 81 79]
wiki Sorted array is: [0 18 26 53 60 66 68 69 72 79 81 90 98]
others Sorted array is: [0 18 26 53 60 66 68 69 72 79 81 90 98]
第二次:
Initial array is: [96 34 36 93 24 55 3 34 11 8 63 7 27]
wiki Sorted array is: [3 7 8 11 24 27 34 34 36 55 63 93 96]
others Sorted array is: [3 7 8 11 24 27 34 34 36 55 63 93 96]
转载请保留原文链接