快速排序
算法
- 初始化基準值遊標,首尾遊標,首遊標爲第二個元素
- 首遊標與基準值比較,大於時尾遊標和首遊標交換,尾遊標向前移動。
- 小於則首遊標與基準值交換,首遊標和基準值遊標向後移動。
- 重複2和3步,直到首遊標遇到尾遊標(注意有等號)。
- 將基準值左邊數組和右邊數組遞歸快排。
go實現
func quickSort(arr []int) {
if len(arr) <= 1 {
return
}
//初始化首尾遊標,
first, end := 1, len(arr)-1
//基準值遊標
mid := 0
//首遊標遇到尾遊標,注意有等號
for first <= end {
//首遊標和基準值比較,大於情況
if arr[first] > arr[mid] {
arr[first], arr[end] = arr[end], arr[first]
//尾遊標移動
end--
} else { //小於情況
arr[first], arr[mid] = arr[mid], arr[first]
//首遊標和基準值遊標右移
first++
mid++
}
}
//將基準值左邊數組和右邊數組遞歸快排
quickSort(arr[:mid])
quickSort(arr[mid+1:])
}
輸出結果
origin: [2 7 3 6 4 1 5 0]
[2 7 3 6 4 1 5 0]
[2 0 3 6 4 1 5 7]
[0 2 3 6 4 1 5 7]
[0 2 5 6 4 1 3 7]
[0 2 1 6 4 5 3 7]
[0 1 2 6 4 5 3 7]
[0 1 2 4 6 5 3 7]
[0 1 2 4 6 5 3 7]
值 2 確定位置在下標: 2
[0 1]
[0 1]
值 0 確定位置在下標: 0
[4 6 5 3 7]
[4 7 5 3 6]
[4 3 5 7 6]
[3 4 5 7 6]
[3 4 5 7 6]
值 4 確定位置在下標: 1
[5 7 6]
[5 6 7]
[5 6 7]
值 5 確定位置在下標: 0
[6 7]
[6 7]
值 6 確定位置在下標: 0
quick sort: [0 1 2 3 4 5 6 7]