数据结构(c语言版)排序3----选择排序

选择排序

1,简单排序算法

基本思想
在待排序的数据中选出最大(小)的元素放在最终的位置
基本操作
(1)首先通过n-1次的关键字比较,从n个记录中找出最小的关键字记录,将它与第一个位置交换。
(2)在通过n-2次的比较,从剩余的n-1个记录中找出最小的关键字记录,将它与第二个位置进行交换。
(3)重复上述操作,共进行n-1趟排序,然后结束排序。
算法实现
存储结构—记录序列以数据表存储

#define MAXSIZE 20                   //设记录不超过20个
typedef int keyType;                //设置关键字为int 整型
typedef struct{                    //定义记录结构
keyType key;                      //关键字
infoType otherInfo;              //其他数据项

}RedType.;

typedef struct{                        //定义顺序表结构类型
RedType  r[MAXSIZE+1];                 //存储数据表的向量
int  length;                           //顺序表长度

}SqList.;                       

简单排序算法实现

void selectSort(SqList &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)    L.r[i]=L.r[k];          //交换
              
       
    }
}

1,堆排序

在这里插入图片描述
从堆的定义可以看出,堆实质就是满足如下性质的完全二叉树:二叉树中任意非叶子节点均大于或小于它的孩子节点。

如下图所示
在这里插入图片描述

堆排序

定义:若在输出堆顶的最大值或者时最小值之后,使得剩余的n-1个记录序列重新组成一个堆,则得到n个元素得次小值或者次大值…如此反复,便能得到一个有序序列,这个过程称为 “堆排序”

堆得调整

如何在输出堆顶元素之后,调整剩余元素为一个新的堆,
小根堆】
(1)输出堆定元素之后,以堆中最后一个元素代替。
(2)然后将根节点得值·与左右子树节点得值进行比较,并与其中较小者进行交换,
(3)重复上述操作,直至叶子节点,将得到新的堆,我们把这个从堆定到叶子得过程称为筛选
筛选算法如图所示
在这里插入图片描述
堆排序算法如下

void HeapSort(elem R[]){    //对R[1]----R[n]进行排序
int i;
for(i=n/2;i>=1;i--)
    HeapAdjust(R,i,n);   //建立初始堆
 for(i=n;i>1;i--){     //进行n-1 趟排序
       Swap(R[1],R[i]);     //根与最后一个元素惊醒交换
       HeapAdjust(R,1,i-1);    对R[1]----R[i-1]  重新建堆
    
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值