实现快速排序
字数 1088 2025-10-27 22:19:36
实现快速排序
题目描述
实现快速排序算法对一个整数数组进行升序排序。快速排序是一种分治算法,其核心思想是选择一个基准元素,将数组划分为两个子数组,使得左子数组的所有元素小于等于基准,右子数组的所有元素大于基准,然后递归地对子数组排序。
解题过程
- 选择基准:从数组中选择一个元素作为基准。常见策略包括选择第一个元素、最后一个元素或随机元素。这里我们选择数组中间的元素作为基准。
- 分区操作:重新排列数组,使得所有小于基准的元素移到其左侧,大于基准的元素移到右侧。分区后,基准元素处于其最终位置。
- 递归排序:对基准左侧和右侧的子数组递归地应用快速排序。
- 终止条件:当子数组的长度为0或1时,无需排序,直接返回。
详细步骤
-
步骤1:定义函数
创建函数quick_sort(arr, low, high),其中arr是待排序数组,low和high是当前子数组的起始和结束索引。 -
步骤2:分区函数
设计辅助函数partition(arr, low, high):- 选择基准元素
pivot(例如arr[(low + high) // 2])。 - 使用双指针法:左指针
i从low开始向右移动,右指针j从high开始向左移动。 - 移动
i直到找到大于pivot的元素,移动j直到找到小于pivot的元素。 - 交换这两个元素,重复直到
i和j相遇。 - 最终返回
j作为分界点(此时arr[j]及左侧元素均 ≤pivot)。
- 选择基准元素
-
步骤3:递归调用
在quick_sort中:- 若
low < high,调用partition获取分界点pivot_index。 - 递归排序左子数组:
quick_sort(arr, low, pivot_index)。 - 递归排序右子数组:
quick_sort(arr, pivot_index + 1, high)。
- 若
-
步骤4:示例演示
对数组[3, 6, 8, 10, 1, 2, 1]:- 首次分区选择基准
pivot=10(中间值),分区后变为[3, 6, 8, 1, 1, 2, 10]。 - 递归处理左子数组
[3, 6, 8, 1, 1, 2],右子数组[](已为空)。 - 持续递归直到所有子数组有序。
- 首次分区选择基准
关键点
- 分区操作确保每轮排序后基准元素位置固定。
- 平均时间复杂度为 O(n log n),最坏情况(如数组已有序)为 O(n²),可通过随机选择基准优化。