堆排序算法
2016-10-14 18:08
253 查看
附:堆&优先级队列的实现
堆排序算法:根据堆具有的性质,我们可以每次将堆顶的数字(也就是最大或者最小的数字)与对数组尾部的数字交换,然后将堆从树的根部开始向下调整,到已经交换的数字的前一个位置截至,那么这样交换以后后边的数字就是有序的了!
堆排序算法:根据堆具有的性质,我们可以每次将堆顶的数字(也就是最大或者最小的数字)与对数组尾部的数字交换,然后将堆从树的根部开始向下调整,到已经交换的数字的前一个位置截至,那么这样交换以后后边的数字就是有序的了!
void HeapSort(int* a,size_t size) { //建堆 for (int i=(size-1)/2; i>=0; --i) { _AdjustDown(a,i,size); } //排序 int index = size-1; for (int i=0; i<size; ++i) { swap(a[0],a[index]); //交换堆顶与最后一个数-------将最大(小)的数据排到最后 _AdjustDown(a,0,index); //从堆顶开始重新向下调整 --index; } for (size_t j=0; j<size; ++j) { cout<<a[j]<<" "; } cout<<endl; } void _AdjustDown(int* a,int root,int size) //向下调整 { int parent = root; int child = parent * 2 + 1; while (child < size) { if ((child+1) < size && a[child+1] > a[child]) //当右子树存在并且右子树大于左子树 { ++child; } if (a[child] > a[parent]) { swap(a[child],a[parent]); parent = child; child = 2*parent +1; } else break; } }