1)简单选择排序
void SeclectSort(SeqList &L){ for(int i=1;i<L.length;i++){ //让i从1到n-1进行n-1趟选择排序(最后一个位置不用再选择了) min=i; for(j=i+1;j<L.length;j++){ if(L.r[j].key<L.r[min].key) min=j; } if(min!=i) swap(L.r[i]=L.r[min]); } }
2)堆排序
void HeapSort(HeapType &H) { //对顺序表进行堆排序 for(i=H.length/2;i>0;--i) //从最后一个非叶子结点开始建立堆 HeapAdjust(H,i,H.length); for(i=H.length;i>1;--i){ //...输出堆顶元素 H.r[1]<-->H.r[i]; //将堆顶记录和最后一个记录交换 HeapAdjust(H,1,i-1); //重新建堆 } } void HeapAdjust(HeapAdjust &H,int s,int m){ //调整为大顶堆 rc=H.r[s]; //暂存堆顶元素 for(j=2*s;j<=m;j*=2){ //从上到下调整。让j指向堆顶左孩子,对其子树依次执行循环体(j*=2) if(j<m&<(H.r[j].key,H.r[j+1].key)) ++j; //如果左孩子小于右孩子,那么把j指右孩子,如果j==m,说明j已经是最后一个结点了,没有右孩子 if(!LT(rc.key,H.r[j].key)) break; //比较堆顶与孩子结点大小,如果堆顶已经比孩子大,break; H.r[s]=H.r[j]; //否则,把堆顶置换为孩子结点元素 s=j; //对其子树进行判断调整,以调整由于之前置换导致的子树下坠情况 } H.r[s]=rc; //把暂存的元素插入最后空出的位置 }