LeetCode 补充题 4. 手撕快速排序

题目描述

🔥 补充题 4. 手撕快速排序

思路分析

思路描述

参考代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
func sortArray(nums []int) []int {
	if len(nums) <= 1 {
		return nums
	}
	rand.Seed(time.Now().UnixNano())
	quickSort(nums, 0, len(nums)-1)
	return nums
}

func quickSort(nums []int, left, right int) {
	if left >= right {
		return // 如果左指针大于等于右指针,结束递归
	}
	// 随机选择基准元素
	pointIndex := rand.Intn(right-left+1) + left
	nums[left], nums[pointIndex] = nums[pointIndex], nums[left] // 将随机基准放到左边
	point := nums[left]                                         // 选择基准
	i, j := left, right

	// 分区过程
	for i < j {
		for i < j && nums[j] >= point {
			j-- // 从右向左找到小于基准的元素
		}
		if i < j {
			nums[i] = nums[j] // 将小于基准的元素放到左边
			i++
		}
		for i < j && nums[i] <= point {
			i++ // 从左向右找到大于基准的元素
		}
		if i < j {
			nums[j] = nums[i] // 将大于基准的元素放到右边
			j--
		}
	}
	nums[i] = point // 将基准放到正确的位置

	// 递归排序左右部分
	quickSort(nums, left, i-1)  // 排序左半部分
	quickSort(nums, i+1, right) // 排序右半部分
}
  • 时间复杂度:
    • 平均情况:O (n log n)
    • 最坏情况:O (n^2)
    • 最好情况:O (n log n)
  • 空间复杂度:O (log n)(最坏情况下可能为 O (n))
1
write your code here

🍏 点击查看 Java 题解

1
write your code here
本文作者:
本文链接: https://hgnulb.github.io/blog/2024/33242831
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!