一.简单选择排序
void SelSort(SqList &L, int low, int high)
{
int min;
for(i=1; i<L.len; i++)
{
min = i;
for(j=i+1; j<=L.len; j++)
if(L.elem[min] > L.elem[j])
min = j;
if(i != min)
swap(L, i, min);
}
}
二.锦标赛排序
用二叉树比较出最小值,是简单选择排序的优化,继续优化即堆排序。
三.堆排序
基本思想:
假设利用大顶堆进行排序
1.将待排序n个记录构造成大顶堆;
2.将堆顶记录与末尾记录进行交换;
3.将剩余n-1个记录重复以上步骤。
//调整堆算法:
void HeapAdjust(SqList &L, int s, int m)
{
//s为调整元素所在位置,m代表当前调整元素总数
temp = L.elem[s]; //1.将待调整记录缓存到temp
for(j=2*s; j<=m; j*=2) //2.找到待调整记录应插入的位置
{
//2.1选择较大的孩子节点,并记录其位置
if(j<m && L.elem[j].key<L.elem[j+1].key)
j++;
//2.2当前节点若大于最大孩子结点,则满足堆特征
if(temp.key >= L.elem[j].key)
break;
//2.3将j位置的记录移动到s位置,并更新s
L.elem[s] = L.elem[j];
s = j;
}
L.elem[s] = temp; //3.在s位置插入待调整记录
}
//堆排序算法
void HeapSort(SqList &L)
{
//新建堆
for(i=L.len/2; i>0; i--)
HeapAdjust(L, i, L.len);
//L.len次选择与调整堆
for(i=L.len; i>1; i--)
{
swap(L, 1, i);
HeapAdjust(L, 1, i-1);
}
}