堆排序(大小根堆)
建堆的时间复杂度为O(n)
更新堆的时间复杂度为O(logn)
堆排序时间复杂度为O(nlogn)
#include <iostream>
#include <vector>
using namespace std;
void adjustHeap(vector<int> &heap, int root, int heap_length){
int left_child = root * 2;
int right_child = root * 2 + 1;
int min_index = root;
if(left_child <= heap_length && right_child <= heap_length){
if(heap[left_child] < heap[root]){
if(heap[left_child] < heap[right_child])
min_index = left_child;
else
min_index = right_child;
}
else{
if(heap[right_child] < heap[root])
min_index = right_child;
else
min_index = root;
}
}
if(left_child <= heap_length && right_child > heap_length){
if(heap[left_child] < heap[root])
min_index = left_child;
else
min_index = root;
}
if(min_index != root){
int temp = heap[root];
heap[root] = heap[min_index];
heap[min_index] = temp;
adjustHeap(heap, min_index, heap_length);
}
return;
}
void createHeap(vector<int> &heap, int heap_length){
for(int index=(heap_length / 2); index>=1; index--){
adjustHeap(heap, index, heap_length);
}
}
void heapSort(vector<int> &heap, int heap_length){
createHeap(heap, heap_length);
while(heap_length != 1){
int temp = heap[heap_length];
heap[heap_length] = heap[1];
heap[1] = temp;
heap_length --;
adjustHeap(heap, 1, heap_length);
}
}
int main()
{
vector<int> heap;
heap.push_back(-1);
for(int i=12; i>=1; i--){
heap.push_back(i);
}
heapSort(heap, heap.size()-1);
for(int i=0; i<heap.size(); i++){
cout << heap[i] << endl;
}
}