Golang快速排序
定義
快速排序由C. A. R. Hoare在1962年提出。快速排序是對冒泡排序的一種改進,采用了一種分治的策略。
基本思想
通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然后再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。
步驟
- 先從數列中取出一個數作為基准數。
- 分區過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊。
- 再對左右區間重復第二步,直到各區間只有一個數。
package main
import "fmt"
/************************************
*函數名:quicksort
*作用:快速排序算法
*參數:
*返回值:無
*模擬:
begin:[]int{12, 85, 25, 16, 34, 23, 49, 95, 17, 61}
-->[],12,[25 16 34 23 49 95 17 61]
---->[23 16 17],25,[95 49 61 85]
------>[17 16],23,[]
-------->[16],17,[]
---------->[],16,[]
------>[34 49 61 85],95,[]
-------->[],34,[61 85 95]
---------->[49],61,[95]
------------>[],49,[]
------------>[85],95,[]
-------------->[],85,[]
last:[]int{12, 16, 17, 23, 25, 34, 49, 61, 85, 95}
************************************/
func quicksort(array []int, begin, end int, mark string) {
var i, j int
if begin < end {
i = begin + 1 // 將array[begin]作為基准數,因此從array[begin+1]開始與基准數比較!
j = end // array[end]是數組的最后一位
for {
if i >= j {
break
}
if array[i] > array[begin] {
array[i], array[j] = array[j], array[i]
j = j - 1
} else {
i = i + 1
}
}
/* 跳出while循環后,i = j。
* 此時數組被分割成兩個部分 --> array[begin+1] ~ array[i-1] < array[begin]
* --> array[i+1] ~ array[end] > array[begin]
* 這個時候將數組array分成兩個部分,再將array[i]與array[begin]進行比較,決定array[i]的位置。
* 最后將array[i]與array[begin]交換,進行兩個分割部分的排序!以此類推,直到最后i = j不滿足條件就退出!
*/
if array[i] >= array[begin] { // 這里必須要取等“>=”,否則數組元素由相同的值時,會出現錯誤!
i = i - 1
}
array[begin], array[i] = array[i], array[begin]
fmt.Printf("%s>%v,%d,%v\n", mark, array[begin:i], array[i], array[j:end])
quicksort(array, begin, i, mark+"--")
quicksort(array, j, end, mark+"--")
}
}
func main() {
nums := []int{12, 85, 25, 16, 34, 23, 49, 95, 17, 61}
fmt.Printf("begin:%#v\n", nums)
// 縮進
mark := "--"
quicksort(nums, 0, len(nums)-1, mark)
fmt.Printf("last:%#v\n", nums)
}