头歌C语言算法设计快速排序
时间: 2024-11-27 07:08:26 浏览: 15
快速排序是一种高效的排序算法,其基本思想是通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,然后分别对这两部分记录继续进行排序,直到整个序列有序。这里以经典的“Lomuto分区”版本为例简述头歌(Hoare选择)的快速排序:
1. **选择基准** (pivot): 首先从数组中随机选取一个元素作为基准值,也可以选择第一个、最后一个或者中间的元素。
2. **划分过程** (partitioning):
- 定义两个指针,`i` 和 `j` 分别指向数组的起始和结束位置。
- 从右向左扫描找到第一个小于基准值的元素,将其交换到 `i` 指向的位置(`arr[i] = arr[j]`),并将 `i` 向右移动一位。
- 然后从左向右扫描找到第一个大于等于基准值的元素,将其交换到 `j` 指向的位置(`arr[j] = arr[i]`),并将 `j` 向左移动一位。
- 当 `i` 不再小于 `j` 时,停止循环,此时 `arr[j]` 就是新的基准值所在的位置。
- 把基准值放到 `i` 的位置,即 `arr[i] = arr[j]`,完成一次划分。
3. **递归调用** (recursion): 对分割后的两个子区间递归地应用上述步骤,直到子区间只剩下一个元素或为空,排序完成。
4. **合并结果**: 由于每次划分都会将数组分为两部分,因此最终只需将所有子区间的结果按顺序连接起来即可。
以下是头歌快速排序伪代码示意:
```
void quicksort(arr[], int low, int high) {
if (low < high) {
// Hoare partitioning
int pivot_index = partition(arr, low, high);
quicksort(arr, low, pivot_index - 1); // Sort left subarray
quicksort(arr, pivot_index + 1, high); // Sort right subarray
}
}
int partition(arr[], int low, int high) {
int pivot = arr[high];
int i = (low - 1);
for (int j = low; j <= high - 1; j++) {
if (arr[j] < pivot) {
i++;
swap(&arr[i], &arr[j]);
}
}
swap(&arr[i + 1], &arr[high]);
return (i + 1);
}
```
阅读全文