创建堆,堆排序

282 阅读1分钟

堆排序(大小根堆)

建堆的时间复杂度为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;
	}
}