问题解析
问题描述
在猫星球上,小R负责给一行排队的猫分发鱼干。每只猫有一个等级,等级越高的猫应该得到更多的鱼干。规则如下:
- 每只猫至少得到一斤鱼干。
- 如果一只猫的等级高于它相邻的猫,它就应该得到比相邻的猫更多的鱼干。 小R想知道,为了公平地满足所有猫的等级差异,他至少需要准备多少斤鱼干。 好的,下面是一个快速排序(Quick Sort)算法的实现。快速排序是一种高效的排序算法,它通过选择一个“基准”元素,将数组分为两部分,一部分小于基准,一部分大于基准,然后递归地对这两部分进行排序。
快速排序算法步骤
- 选择基准元素:从数组中选择一个元素作为基准(pivot)。通常选择第一个或最后一个元素。
- 分区操作:将数组分为两部分,一部分小于基准,一部分大于基准。
- 递归排序:对分区的两部分分别递归地进行快速排序。
代码实现
#include <iostream>
#include <vector>
// 分区函数,返回基准元素的最终位置
int partition(std::vector<int>& arr, int low, int high) {
int pivot = arr[high]; // 选择最后一个元素作为基准
int i = low - 1; // i 是小于基准的元素的最后一个位置
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]); // 将基准元素放到正确的位置
return i + 1;
}
// 快速排序函数
void quickSort(std::vector<int>& arr, int low, int high) {
if (low < high) {
int pi = partition(arr, low, high); // 获取分区点
// 递归排序分区后的两部分
quickSort(arr, low, pi - 1);
quickSort(arr, pi + 1, high);
}
}
int main() {
std::vector<int> arr = {10, 7, 8, 9, 1, 5};
int n = arr.size();
quickSort(arr, 0, n - 1);
std::cout << "Sorted array: ";
for (int i = 0; i < n; i++) {
std::cout << arr[i] << " ";
}
std::cout << std::endl;
return 0;
}
代码解释
- partition函数:负责将数组分区,并返回基准元素的最终位置。
- quickSort函数:递归地对数组进行排序。
- main函数:测试快速排序算法。
时间复杂度
- 最坏情况:
O(n^2),当每次选择的基准元素都是最大或最小值时。 - 平均情况:
O(n log n),通常情况下快速排序表现良好。