持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第7天,点击查看活动详情
前言
前几天分享了插入排序与交换排序,今天来继续分享。今天的排序是选择排序。
选择排序
基本思想
每一趟在后面n-i个待排记录中 选取关键字最小的记录作为有序序列中的第i个记录。
经典算法
- 简单选择排序
- 堆排序
简单选择排序
思路
每经过一趟比较就找出一个最小值,与待排序列最前面的位置互换。
展开理解就是首先,在n个记录中选择最小者放到r[1]位置;然后,从剩 余的n-1个记录中选择最小者放到r[2]位置;…如此进行下去,直到全部有序为止。
例:T=(21,25,49,25*,16,08)
算法
SELECTSORT(){
int i,j,k;
for (i=1;i<n;i++){
k=i;
for(j=i+1;j<=n;j++){
if (p[j] < p[k]) k=j;
if (k!=i){
temp=p[ i ];
p[ i ]=p[ k ];
p[ k ]=temp;
}
}
}
}
堆排序
堆的定义
如果让满足以上条件的元素序列(k1,k2,…,kn)顺次排成一棵完全二叉树,则此树的特点是: 树中所有根结点的值均大于(或小于)其左右孩子,此树的根结点(即堆顶)必最大(或最小)
怎样建立堆
从最后一个非终端结点开始往前逐步调整,让每个 双亲大于(或小于)子女,直到根结点为止。
进行堆排序
关键的问题在于:将堆的当前顶点输出后,如何将剩余序列重新调整为堆。
解决:将当前顶点与堆尾记录交换,然后仿建堆动作,从上至下新调整,如此反复直至排序结束。