堆排序算法思路详解
堆排序是一种常见的排序算法,其时间复杂度为O(logN),重要思想为建堆取极值,根据需求进行排序,如下图:
值得思考的是,二次建堆的过程中,实际上是没有必要将所有元素都进行下调,只需要将根进行下调:
实现代码如下:
template<classT>//建立仿函数模板满足排序需求structCompMax{booloperator()(constT&a,constT&b){returna>b;}};template<classT>structCompMin{booloperator()(constT&a,constT&b){returna<b;}};template<classT,classCom=CompMax<T>>staticvoidHeapSort(vector<T>&list){size_tsize=list.size();GetHeap<T>(list,size);swap(list[0],list[size-1]);while(--size>1){adjustdown<T>(0,size,list);swap(list[0],list[size-1]);}}template<classT,classCom=CompMax<T>>voidadjustdown(intindex,size_tsize,vector<T>&list){Comcomp;size_tparent=index;size_tchild=parent*2+1;while(child<size){if(child+1<size)child=child=comp(list[child],list[child+1])?child:child+1;if(!comp(list[parent],list[child])){std::swap(list[child],list[parent]);parent=child;child=parent*2+1;}elsebreak;}}template<classT,classCom=CompMax<T>>staticvoidGetHeap(vector<int>&list,size_tsize){size_tparent=(size-2)/2;intbegin=parent;Comcomp;while(begin>=0){size_tchild=parent*2+1;while(child<size){if(child+1<size)child=child=comp(list[child],list[child+1])?child:child+1;if(!comp(list[parent],list[child])){swap(list[child],list[parent]);parent=child;child=parent*2+1;}elsebreak;}parent=--begin;}}
如有不足,希望指正,有疑问也希望提出
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。