帮我写一段快排代码,并帮我讲解下实现逻辑
时间: 2024-09-13 17:07:43 浏览: 38
快速排序(Quicksort)是一种高效的排序算法,它的基本思想是分而治之。下面是使用C++编写的快速排序示例:
```cpp
#include <iostream>
#include <vector>
// 快速排序主函数
void quickSort(std::vector<int>& arr, int low, int high) {
if (low < high) {
// 选择基准元素
int pivot = arr[high];
int i = low - 1;
for (int j = low; j < high; j++) {
// 如果当前元素小于或等于基准,将其移到左侧
if (arr[j] <= pivot) {
i++;
std::swap(arr[i], arr[j]);
}
}
// 将基准元素放到正确的位置
std::swap(arr[i + 1], arr[high]);
// 对左右两侧进行递归排序
quickSort(arr, low, i);
quickSort(arr, i + 2, high);
}
}
int main() {
std::vector<int> numbers = {9, 7, 5, 11, 12, 2, 14, 3, 10};
int n = numbers.size();
std::cout << "Before sorting:\n";
for (int num : numbers) {
std::cout << num << " ";
}
std::cout << "\n";
quickSort(numbers, 0, n - 1);
std::cout << "After sorting:\n";
for (int num : numbers) {
std::cout << num << " ";
}
std::cout << "\n";
return 0;
}
```
**实现逻辑**:
1. **划分过程**:选择数组的一个元素作为基准(这里通常选择最后一个元素),然后从左到右扫描数组,如果遇到比基准小的数,就把它与i位置的元素交换,直到找到一个大于或等于基准的数。
2. **放置基准**:当扫描结束后,基准所在的位置就是所有小于或等于它的数的最右侧,此时将基准放在这个位置上。
3. **递归调用**:对基准左边的子序列和右边的子序列分别进行同样的划分和排序,这是“分治”策略的关键点。
4. **基本情况**:如果待排序序列只有一个元素或者没有元素,那么它已经是有序的,因此递归结束。
快速排序的时间复杂度为平均O(n log n),但在最坏情况下(如数组已经完全有序),时间复杂度为O(n^2)。不过,通过随机化选取基准值,我们可以避免最坏情况的发生。
阅读全文