8.4 数据结构——选择排序

8.4.1 简单选择排序

基本思想:在待排序的数据中选出最大(小)的元素放在其开始的位置。

基本操作:

(1)首先通过n-1次关键字比较,从n个记录中找出关键字最小的记录,将它与第一个交换;

(2)再通过n-2次比较,从剩余的n-1个记录中找出关键字次小的记录,将它与第二个交换;

(3)重复上述操作,共进行n-1趟排序后,排序结束。

简单选择排序算法:

void Select_Sort(SQList *L)
{
    int k;
    for (int i = 1; i < L->length; i++)
    {
        k = i;
        for (int j = i+1; j <= L->length; j++)
        {
            if (L->r[j].key < L->r[k].key)
            {
                k = j;
            }
        }
        if (k != i)
        {
            RedType tmp = L->r[i];
            L->r[i] = L->r[k];
            L->r[k] = tmp;
        }
    }
}

8.4.2 堆排序

堆的定义:若n个元素的序列{a1,a2,...,an}满足:

则分别称该序列{a1,a2,...,an} 为小根堆和大根堆。

从堆的定义可以看出:堆使之是满足如下性质的完全二叉树:二叉树中任一非叶子结点均小于(大于)它的孩子结点。

堆排序:若在输出堆顶的最小值(最大值)后,使得剩余n-1个元素的序列重新建立一个堆,则得到n个元素的次小值(次大值)……如此重复,使能得到一个有序序列,这个过程称之为堆排序。

堆的调整:

如何在输出堆顶元素后,调整剩余元素成为新的堆?

(1)输出堆顶元素后,以堆中最后一个元素代替之;

(2)然后将根结点值与左、右子树的根结点进行比较,并与其中最小值进行交换;

(3)重复上述操作,直至叶子结点,将得到新的堆,成这个从堆顶至叶子的调整过程称为“筛选”。

如何建立堆?

例:{49,38,65,97,76,13,27,49} 

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值