#include
#include
using namespace std;
// 用于交换元素的辅助函数
void swap(int *a, int *b) {
int t = *a;
*a = *b;
*b = t;
}
// 快速排序的分区函数
int partition(vector<int>& 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);
}
// 快速排序的主函数
void quickSort(vector<int>& arr, int low, int high) {
if (low < high) {
// pi 是分区索引,arr[pi] 现在放在正确的位置
int pi = partition(arr, low, high);
// 分别对分区前后的元素进行递归排序
quickSort(arr, low, pi - 1);
quickSort(arr, pi + 1, high);
}
}
int main() {
int n;
cin >> n;
vector<int> treasures(n);
for (int i = 0; i < n; i++) {
cin >> treasures[i];
}
quickSort(treasures, 0, n - 1);
for (int i = 0; i < n; i++) {
cout << treasures[i] << (i < n - 1 ? " " : "\n");
}
return 0;
}
代码分析:
swap
void swap(int *a, int *b) {
int t = *a;
*a = *b;
*b = t;
}
这个函数用于交换两个整数变量的值。它接受两个整数的指针作为参数,并通过中间变量t
来交换a
和b
指向的值。
partition
int partition(vector<int>& 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);
}
partition
函数实现了快速排序中的分区操作。它接受一个数组arr
和两个索引low
和high
作为参数:
pivot
是基准值,这里选择数组的最后一个元素作为基准。i
作为小于基准值序列的游标。arr[j]
小于或等于pivot
,就将其移到数组的左侧(通过交换arr[i]
和arr[j]
)。arr[i+1]
)。quickSort
void quickSort(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);
}
}
quickSort
函数递归地对数组arr
进行排序:
low
是否小于high
,如果不是,意味着子数组已经是一个元素或者空,不需要排序。pi
是通过partition
函数返回的分区后基准值的索引。quickSort
。main
int main() {
int n;
cin >> n;
vector<int> treasures(n);
for (int i = 0; i < n; i++) {
cin >> treasures[i];
}
quickSort(treasures, 0, n - 1);
for (int i = 0; i < n; i++) {
cout << treasures[i] << (i < n - 1 ? " " : "\n");
}
return 0;
}
在main
函数中:
n
。vector
类型的数组treasures
用于存储这些宝藏的价值。treasures
数组中。quickSort
函数对数组进行排序。在这个代码中,快速排序算法利用了递归和分区策略来高效地对数据进行排序,特别适合处理大量数据。由于partition
函数的效率及递归的高效性,快速排序通常比较快,平均时间复杂度为O(n log n),但在最差情况下是O(n^2)。由于代码中的基准选择是固定的(最后一个元素),在最坏的情况下可能会达到最差性能,例如当输入已经是有序时。在实际应用中,通常会使用随机化版本的快速排序来避免这个问题。