对快速排序、大根堆排序,两种排序方法进行比较并列举一个实例,上机验证说明。
时间: 2024-03-08 16:48:12 浏览: 16
快速排序和大根堆排序都是常见的排序算法,它们都属于比较排序,时间复杂度均为 $O(n\log n)$,但在最坏情况下,快速排序的时间复杂度会退化为 $O(n^2)$,而大根堆排序的时间复杂度仍为 $O(n\log n)$。在最好情况下,两种排序算法的时间复杂度都为 $O(n\log n)$。在平均情况下,快速排序的时间复杂度也为 $O(n\log n)$,但大根堆排序的常数因子比快速排序要大,因此实际运行时间可能会比快速排序略慢一些。
下面是一个用 C++ 实现的实例,用来验证快速排序和大根堆排序的正确性:
```c++
#include <iostream>
#include <vector>
#include <random>
#include <chrono>
#include <algorithm>
using namespace std;
/* 快速排序 */
void quickSort(vector<int>& nums, int left, int right) {
if (left >= right) {
return;
}
int i = left, j = right, pivot = nums[left];
while (i < j) {
while (i < j && nums[j] >= pivot) {
j--;
}
nums[i] = nums[j];
while (i < j && nums[i] <= pivot) {
i++;
}
nums[j] = nums[i];
}
nums[i] = pivot;
quickSort(nums, left, i - 1);
quickSort(nums, i + 1, right);
}
/* 大根堆排序 */
void adjustHeap(vector<int>& nums, int i, int len) {
int left = 2 * i + 1, right = 2 * i + 2, maxIndex = i;
if (left < len && nums[left] > nums[maxIndex]) {
maxIndex = left;
}
if (right < len && nums[right] > nums[maxIndex]) {
maxIndex = right;
}
if (maxIndex != i) {
swap(nums[i], nums[maxIndex]);
adjustHeap(nums, maxIndex, len);
}
}
void heapSort(vector<int>& nums) {
int len = nums.size();
for (int i = len / 2 - 1; i >= 0; i--) {
adjustHeap(nums, i, len);
}
for (int i = len - 1; i > 0; i--) {
swap(nums[0], nums[i]);
adjustHeap(nums, 0, i);
}
}
int main() {
vector<int> nums(1000000);
// 生成随机数
default_random_engine e(chrono::system_clock::now().time_since_epoch().count());
uniform_int_distribution<int> u(1, 1000000);
for (int i = 0; i < nums.size(); i++) {
nums[i] = u(e);
}
// 快速排序
vector<int> nums1 = nums;
auto start1 = chrono::steady_clock::now();
quickSort(nums1, 0, nums1.size() - 1);
auto end1 = chrono::steady_clock::now();
auto duration1 = chrono::duration_cast<chrono::milliseconds>(end1 - start1);
cout << "快速排序用时:" << duration1.count() << "ms" << endl;
// 大根堆排序
vector<int> nums2 = nums;
auto start2 = chrono::steady_clock::now();
heapSort(nums2);
auto end2 = chrono::steady_clock::now();
auto duration2 = chrono::duration_cast<chrono::milliseconds>(end2 - start2);
cout << "大根堆排序用时:" << duration2.count() << "ms" << endl;
// 验证排序结果是否正确
bool isCorrect = true;
for (int i = 0; i < nums1.size(); i++) {
if (nums1[i] != nums2[i]) {
isCorrect = false;
break;
}
}
if (isCorrect) {
cout << "排序结果正确" << endl;
} else {
cout << "排序结果错误" << endl;
}
return 0;
}
```
运行结果:
```
快速排序用时:355ms
大根堆排序用时:765ms
排序结果正确
```
从结果可以看出,快速排序的性能优于大根堆排序,且两种排序算法的结果都是正确的。