/*
* HeapSort.cpp
*
* Created on: 2014年3月26日
* Author: yjx
*/
#include <iostream>
#include <vector>
using namespace std;
class HeapSort {
private:
vector<int> vec;
inline int parent(int i) { return i/2; };
inline int leftChild(int i) { return 2*i; };
inline int rightChild(int i) { return 2*i+1; };
public:
void init();
int getHeapSize();
int getValue(int i);
void setValue(int i, int value);
void traverse();
void max_heapify(int i);
void build_max_heap();
void heap_sort();
};
void HeapSort::heap_sort() {
build_max_heap();
while(getHeapSize() > 1) {
int temp = getValue(1);
setValue(1, getValue(getHeapSize()));
setValue(getHeapSize(), temp);
setValue(0, getHeapSize()-1);
max_heapify(1);
}
}
void HeapSort::build_max_heap() {
for (int i = getHeapSize()/2; i > 0; i--) {
max_heapify(i);
}
}
void HeapSort::max_heapify(int i) {
int largest = i;
int left = leftChild(i);
int right = rightChild(i);
if (left <= getHeapSize() && getValue(largest) < getValue(left)) {
largest = left;
}
if (right <= getHeapSize() && getValue(largest) < getValue(right)) {
largest = right;
}
if (largest != i) {
int temp = getValue(i);
setValue(i, getValue(largest));
setValue(largest, temp);
max_heapify(largest);
}
}
void HeapSort::traverse() {
for (vector<int>::iterator iter = vec.begin(); iter != vec.end(); iter++) {
std::cout << *iter << std::endl;
}
}
void HeapSort::setValue(int i, int value) {
vector<int>::iterator iter = vec.begin();
*(iter+i) = value;
}
int HeapSort::getValue(int i) {
vector<int>::iterator iter = vec.begin();
return *(iter+i);
}
int HeapSort::getHeapSize() {
return getValue(0);
}
void HeapSort::init() {
std::cout << "how many elements do you want to enter: ";
int count;
std::cin >> count;
vec.push_back(count);
int element;
for (int i = 0; i < count; i++) {
std::cin >> element;
vec.push_back(element);
}
}
int main() {
HeapSort *ms = new HeapSort();
ms->init();
std::cout << "heap size: " << ms->getHeapSize() << std::endl;
ms->heap_sort();
ms->traverse();
delete ms;
}
07-17
07-17
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交