第一种
建堆的时间复杂度O(nlogn)
时间复杂度O(nlongn)
空间复杂度O(n)
#include <iostream>
#include <vector>
#include <algorithm>
#include <cassert>
#include <ctime>
using namespace std;
template <typename Item>
class MaxHeap {
public:
MaxHeap(int capacity) {
data = new Item[capacity + 1];
count = 0;
this->capacity = capacity;
}
~MaxHeap() {
detele[] data;
}
void insert(Item item) {
assert(count + 1 <= capacity);
data[count + 1] = item;
count++;
shiftup(count);
}
Item extractMax() {
assert(count > 0);
Item ret = data[1];
swap(data[1], data[count]);
count--;
shiftDown(1);
return ret;
}
private:
void shiftup(int k) { //插入时调整堆
while (k > 1 && data[k / 2] < data[k]) {
swap(data[k / 2], data[k]);
k /= 2;
}
}
void shiftDown(int k) { //取出时调整堆
while (2 * k <= count) {
int j = 2 * k;
if (j + 1 <= count && data[j + 1] > data[j]) //右节点存在和大小判定
j++;
if (data[k] >= data[j]) //父节点大于左右子节点
break;
swap(data[k], data[j]);
k = j;
}
}
private:
int *data;
int count;
int capacity;
};
template <typename T>
void heapSort(T arr[], int n) {
MaxHeap<T> maxheap = MaxHeap<T>(n);
for (int i = 0; i < n; ++i)
maxheap.insert(arr[i]);
for (int i = n - 1; i >= 0; --i)
arr[i] = maxheap.extractMax();
}
int main()
{
srand(time(NULL));
int *arr = new int[100];
for (int i = 0; i < 100; ++i)
arr[i] = rand() % (i + 1);
heapSort(arr, 100);
for (int i = 0; i < 100; ++i)
cout << arr[i] << " ";
cout << endl;
delete arr;
return 0;
}