选择排序

一.简单选择排序

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);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值