算法分析:堆排序
基本原理就是构建一个堆,然后删除根。
为了不用一个新的堆,把抽取出来的数据,放在堆末尾。
所以,要实现一个升序排序,就要构建一个最大堆,不停抽取最大数,放到末尾处。
//----------------堆排序-------------------- template<typename Comparable> void heapsort(Vector<Comparable>& a) { //构建堆,从二分一后的点都是在最底层的,所以往回执行下滤,一路向上,构建一个最大堆 for (int i = a.size() / 2; i >= 0; i--) { percDown(a, i, a.size()); } for (int j = a.size() - 1; j > 0; j--) { //交换头尾,得出最大的值在队尾,堆减少, Comparable temp = a[0]; a[0] = a[j]; a[j] = temp; //破坏了堆结构,执行下滤 percDown(a, 0, j); } } int leftChild(int i) { return 2 * i + 1; } template<typename Comparable> void percDown(Vector<Comparable>& a, int i, int n) { int child; Comparable tmp = a[i];//当前需要下滤的实体 for ( ; leftChild(i) < n; i = child) { child = leftChild(i);//左边的儿子 if (child != n -1 && a[child] < a[child + 1]) { child++;//左边的儿子比右边的儿子小,这是找大的一个 } if (tmp < a[child])//比儿子小 { a[i] = a[child]; } else { break; } } a[i] = tmp; }
人生如戏,还是戏如人生?微信公众号:传说之路
csdn博客 http://blog.csdn.net/u012175089/article/list/2