对快速排序、大根堆排序,两种排序方法进行比较,写出大根堆排序算法。并对它们最坏、最好,平均情况进行比较分析
时间: 2024-03-06 14:47:39 浏览: 69
快速排序和大根堆排序都是常见的排序算法,下面对它们进行比较,并给出大根堆排序的实现。
快速排序和大根堆排序的时间复杂度:
- 最好情况下,快速排序的时间复杂度是$O(nlogn)$,大根堆排序的时间复杂度也是$O(nlogn)$。
- 平均情况下,快速排序的时间复杂度是$O(nlogn)$,大根堆排序的时间复杂度也是$O(nlogn)$。
- 最坏情况下,快速排序的时间复杂度是$O(n^2)$,大根堆排序的时间复杂度是$O(nlogn)$。
可以看出,虽然两种排序算法在时间复杂度上没有太大的区别,但是在最坏情况下,快速排序的效率明显低于大根堆排序,因此在实际应用中,需要根据具体情况选择使用哪种排序算法。
下面是大根堆排序的实现(C++):
```cpp
#include <iostream>
#include <vector>
using namespace std;
void maxHeapify(vector<int>& nums, int idx, int heapSize) {
int left = 2 * idx + 1;
int right = 2 * idx + 2;
int largest = idx;
if (left < heapSize && nums[left] > nums[largest]) {
largest = left;
}
if (right < heapSize && nums[right] > nums[largest]) {
largest = right;
}
if (largest != idx) {
swap(nums[idx], nums[largest]);
maxHeapify(nums, largest, heapSize);
}
}
void buildMaxHeap(vector<int>& nums) {
int heapSize = nums.size();
for (int i = heapSize / 2 - 1; i >= 0; i--) {
maxHeapify(nums, i, heapSize);
}
}
void heapSort(vector<int>& nums) {
buildMaxHeap(nums);
int heapSize = nums.size();
for (int i = nums.size() - 1; i >= 1; i--) {
swap(nums[0], nums[i]);
heapSize--;
maxHeapify(nums, 0, heapSize);
}
}
int main() {
vector<int> nums = {5, 4, 3, 2, 1};
heapSort(nums);
for (int num : nums) {
cout << num << " ";
}
cout << endl;
return 0;
}
```
大根堆排序的实现主要分为两个步骤:
1. 建立大根堆:从最后一个非叶子节点开始,逐步调整节点,使得每个节点都满足父节点大于等于子节点的要求,从而建立一个大根堆。
2. 排序:每次将堆顶元素(即最大元素)与最后一个元素交换位置,然后将堆的大小减1,并调整堆,使得堆仍然满足大根堆的要求。重复进行这个过程,直到堆的大小为1,排序结束。
综上所述,大根堆排序是一种高效的排序算法,它的时间复杂度为$O(nlogn)$,并且在最坏情况下也能够保持这个时间复杂度。
阅读全文