/**************************************************** 树形选择排序(Tree Selection Sort): 1. 是稳定的排序方法。 2. 算法的时间复杂度为O(nlogn)。 3. 要构造一个n个叶子节点的完全二叉树。 4. 需要大量的辅助空间,另外“最大值”进行了多余比较。 ****************************************************/ // 该算法转自严蔚敏书中代码(这里不再重写) void TreeSort(SqList &L) { // 树形选择排序 int i,n; RedType *t; t=(RedType*)malloc((2*L.length-1)*sizeof(RedType)); // 二叉树采用顺序存储结构 for(i=1;i<=L.length;i++) // 将L.r赋给叶子结点(从上到下,从左到右) t[L.length-2+i]=L.r[i]; for(i=L.length-2;i>=0;i--) // 由后向前给非叶子结点赋值 t[i]=t[2*i+1].key<=t[2*i+2].key?t[2*i+1]:t[2*i+2]; // 非叶子结点的值为其左右孩子中关键字小的 for(i=0;i<L.length;i++) { L.r[i+1]=t[0]; // 将当前最小值赋给L.r[i] n=0; // 根结点序号 do // 沿树根按层找结点t[0]在叶子中的序号n { n=t[2*n+1].key==t[n].key?2*n+1:2*n+2; }while(n<L.length-1); t[n].key=INT_MAX; // 将此叶子结点的关键字赋无穷大 while(n) // n不是根结点 { n=(n+1)/2-1; // 序号为n的结点的双亲结点序号 t[n]=t[2*n+1].key<=t[2*n+2].key?(t[2*n+1]):(t[2*n+2]); // 非叶子结点的值为其左右孩子中关键字小的 } } free(t); // 释放t所指的存储空间 }