Skip to content

Commit d93e3ef

Browse files
committed
feat: 优化快排
1 parent 5db140a commit d93e3ef

File tree

1 file changed

+20
-20
lines changed

1 file changed

+20
-20
lines changed

algorithms/sort/quick/quick.go

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -13,33 +13,33 @@ package quick
1313
//递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。
1414

1515
func QuickSort(arr []int) []int {
16-
return quickSort(arr, 0, len(arr)-1)
16+
quickSort(arr, 0, len(arr)-1)
17+
return arr
1718
}
1819

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
2424
}
25-
return arr
25+
pivot := partition(arr, left, right)
26+
quickSort(arr, left, pivot-1)
27+
quickSort(arr, pivot+1, right)
2628
}
2729

30+
// 分区函数
2831
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++
3638
}
3739
}
38-
swap(arr, pivot, index-1) //将基准交换到中间位置
39-
return index - 1
40-
40+
// 处理基准值
41+
arr[i], arr[right] = arr[right], arr[i]
42+
return i
4143
}
4244

43-
func swap(arr []int, i, j int) {
44-
arr[i], arr[j] = arr[j], arr[i]
45-
}
45+
// 空间复杂度:O(1), 在分区时使用原地交换的方式

0 commit comments

Comments
 (0)