堆排序_heap_sort
2014-02-15 09:55
337 查看
#include <iostream> #include <vector> #include <conio.h> using namespace std; class DataType:public vector<int> { public: int heapSize; DataType():heapSize(0){}; ~DataType(){}; protected: private: }; /* 将index为结点的子树调整为最大堆,保持最大堆的性质,以index的左右孩子为根的二叉树必须也是最大堆。 */ void max_heapify(DataType &data, int index) { int l = index << 1; //计算左孩子 int r = l + 1; //得到右孩子 //找出该节点和其左右孩子中最大的 int largest = 0; if (l <= data.heapSize && data[l] > data[index]) { largest = l; } else { largest = index; } if (r <= data.heapSize && data[r] > data[largest]) { largest = r; } //若该节点不为最大,则与最大的交换,并在最大的节点处递归调用该函数。 if (largest != index) { int temp = data[index]; data[index] = data[largest]; data[largest] = temp; max_heapify(data, largest); } } /* 建立最大堆 */ void buile_max_heap(DataType &data) { //因为为了方便,data[0]为设定的0,所以要减一 data.heapSize = data.size() - 1; for (int i = data.heapSize / 2; i > 0; i--) { max_heapify(data, i); } } /* 堆排序算法 */ void heap_sort(DataType &data) { //建立最大堆 buile_max_heap(data); //将最大值交换到最后,并调用max_heapify使堆保持最大堆的性质 for (int i = data.size() - 1; i > 1; i--) { int temp = data[i]; data[i] = data[1]; data[1] = temp; data.heapSize--; max_heapify(data, 1); } } int main() { DataType data; data.push_back(0); int temp = 0; while (cin >> temp) { data.push_back(temp); } heap_sort(data); for (vector<int>::iterator iter = data.begin(); iter != data.end(); iter++) { cout << *iter; cout << " "; } getch(); return 0; }
相关文章推荐
- 堆排序 Heap Sort
- [数据结构与算法]堆排序 Heap Sort
- 堆排序(HeapSort)
- 堆排序(HeapSort)
- [classic algo]-heap sort 堆排序
- 堆排序 HeapSort
- C++、C#、java算法学习日记06----堆排序思想(HeapSort)
- 经典排序算法 - 堆排序Heap sort
- 堆排序 Heap Sort
- 堆排序(heap Sort)
- 堆排序 (Heapsort)
- 【排序算法】 堆排序 heap sort(选择类排序)
- 经典算法(9)- 堆排序(Heapsort)
- 堆排序(heap sort)
- 堆排序(Heapsort)
- HeapSort -- 堆排序
- 堆排序 HeapSort
- Java排序算法--堆排序(HeapSort)
- 排序——堆排序(HeapSort)
- 堆排序(1)HeapSort