快速排序法 分治算法的划分算法老海指针从左到右的代码
时间: 2024-12-20 10:22:59 浏览: 2
分治法验证快速排序和合并排序
快速排序是一种基于分治策略的高效排序算法,它的基本思想是通过一趟排序将待排记录分隔成独立的两部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后分别对这两部分继续进行排序,直到整个序列有序。
划分过程通常由两个指针(也称作"pivot"或"基准") 完成。以下是快速排序的一个简化版的划分算法步骤,以从左向右扫描为例:
1. **选择基准**:通常选取数组的第一个元素作为基准值 pivot。
2. **设置两个指针**:初始化两个指针 i(指向开始位置),j(指向结束位置,初始值为i+1)。
3. **遍历数组**:
a. 如果 `arr[i]` 小于等于 `pivot`,则将 i 向右移动一位,并将 `arr[j]` 的值与 `arr[i]` 交换,因为 j 已经找到了一个大于 `pivot` 的元素。
b. 然后检查 `arr[j]` 是否仍然小于 `pivot`。如果是,则继续移动 j。
4. **当 `i` 和 `j` 遇到一起**,说明已经找到一个分区点,此时 `arr[j]` 就是比基准值大的第一个元素,将它与 pivot 交换,使得所有小于 pivot 的元素都在其左边,大于 pivot 的元素在其右边。
5. **递归处理左右两部分**:对基准左侧的子数组(包括基准本身)和右侧的子数组分别进行同样的划分操作。
这是一个简单的描述,实际编程时会包含更多的边界条件判断和优化。以下是一个简化的 Python 代码示例:
```python
def quicksort(arr):
if len(arr) <= 1:
return arr
pivot = arr[0]
i, j = 0, len(arr) - 1
while i < j:
# i 指针向右找第一个大于 pivot 的数
while i < j and arr[j] >= pivot:
j -= 1
if i < j:
arr[i] = arr[j]
# j 指针向左找第一个小于 pivot 的数
while i < j and arr[i] <= pivot:
i += 1
if i < j:
arr[j] = arr[i]
arr[i] = pivot # 将 pivot 放置在正确的位置
return quicksort(arr[:i]) + [pivot] + quicksort(arr[i+1:])
```
阅读全文