堆排序

来源:互联网 发布:淘宝投诉人工客服电话 编辑:程序博客网 时间:2024/06/02 07:14

堆排序:

1.建大堆;

2.堆顶元素和堆最后一个元素交换;

3.继续建大堆(从上往下调整);

4.再取堆顶元素与堆尾倒数第二个元素交换;

5.升序输出

代码:

#pragma once#include<iostream>#include<vector>//using namespace std;  //尽量不要让 using出现在头文件中 template<class T>class Heap{public://构造Heap();//建大堆Heap(const T* a,size_t size);//堆排序void HeapSort();//建堆副void _Heap(const T* a,size_t size);//虚向下调整 实向上走void AdjustDown(int index,int num);void AdjustUp(int index);//打印void Print();private:vector<T> MinHeap;};template<class T>Heap<T>::Heap(){}template<class T>Heap<T>::Heap(const T* a,size_t size){_Heap(a,size);}template<class T>void Heap<T>::_Heap(const T *a, size_t size){for(int i = 0; i < size; i++){MinHeap.push_back(a[i]);}//第一个非叶子结点开始for(int i = (MinHeap.size()-2)/2; i >= 0; i--){AdjustUp(i);}}template<class T>void Heap<T>::AdjustDown(int index,int num){int child = 2*index+1;int cout = num+1;while(child < MinHeap.size()-cout){if(child+1 <MinHeap.size()-cout && MinHeap[child] < MinHeap[child+1]){child++;}if(MinHeap[child] > MinHeap[(child-1)/2]){swap(MinHeap[child],MinHeap[(child-1)/2]);index = child; //交换后的是不是打乱了顺序  继续child = 2*index+1;//等效循环外的第一个条件}else{break;}}}template<class T>void Heap<T>::AdjustUp(int index){int child = index*2 + 1;while(child < MinHeap.size()){if((child+1)< MinHeap.size() && MinHeap[child+1] > MinHeap[child]){child++;}if(MinHeap[child] > MinHeap[(child-1)/2]){swap(MinHeap[child],MinHeap[(child-1)/2]);index = child;child = 2*index+1;}else{break;}}}template<class T>void Heap<T>::HeapSort(){for(int i = 0; i < MinHeap.size(); i++){int num = MinHeap.size()-i-1;swap(MinHeap[0],MinHeap[num]);AdjustDown(0,i);}}template<class T>void Heap<T>::Print(){for(int i = 0; i < MinHeap.size();i++){cout<<MinHeap[i]<<" ";}cout<<endl;}


0 0