@@ -13,33 +13,33 @@ package quick
13
13
//递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。
14
14
15
15
func QuickSort (arr []int ) []int {
16
- return quickSort (arr , 0 , len (arr )- 1 )
16
+ quickSort (arr , 0 , len (arr )- 1 )
17
+ return arr
17
18
}
18
19
19
- func quickSort (arr []int , left , right int ) []int {
20
- if left < right {
21
- partitionIndex := partition (arr , left , right ) //找分区点
22
- quickSort (arr , left , partitionIndex - 1 )
23
- quickSort (arr , partitionIndex + 1 , right )
20
+ // left,right分别为数组的最左、最右下标
21
+ func quickSort (arr []int , left , right int ) {
22
+ if left >= right { // 递归截止条件
23
+ return
24
24
}
25
- return arr
25
+ pivot := partition (arr , left , right )
26
+ quickSort (arr , left , pivot - 1 )
27
+ quickSort (arr , pivot + 1 , right )
26
28
}
27
29
30
+ // 分区函数
28
31
func partition (arr []int , left , right int ) int {
29
- pivot := left
30
- index := pivot + 1
31
-
32
- for i := index ; i <= right ; i ++ {
33
- if arr [i ] < arr [pivot ] { //这里是关键,找到一个比基准大的数和一个比基准小的数进行交换
34
- swap (arr , i , index )
35
- index += 1
32
+ pivot := arr [right ] // 选择数组的最后一个元素作为基准值
33
+ i := left // 数组最左元素的下标
34
+ for j := left ; j < right ; j ++ {
35
+ if arr [j ] < pivot { // 将小于基准值的元素交换到左边
36
+ arr [i ], arr [j ] = arr [j ], arr [i ]
37
+ i ++
36
38
}
37
39
}
38
- swap ( arr , pivot , index - 1 ) //将基准交换到中间位置
39
- return index - 1
40
-
40
+ // 处理基准值
41
+ arr [ i ], arr [ right ] = arr [ right ], arr [ i ]
42
+ return i
41
43
}
42
44
43
- func swap (arr []int , i , j int ) {
44
- arr [i ], arr [j ] = arr [j ], arr [i ]
45
- }
45
+ // 空间复杂度:O(1), 在分区时使用原地交换的方式
0 commit comments