排序算法—选择排序

113 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第7天,点击查看活动详情

前言

前几天分享了插入排序与交换排序,今天来继续分享。今天的排序是选择排序。

选择排序

基本思想

每一趟在后面n-i个待排记录中 选取关键字最小的记录作为有序序列中的第i个记录。

经典算法

  1. 简单选择排序
  2. 堆排序

简单选择排序

思路

每经过一趟比较就找出一个最小值,与待排序列最前面的位置互换。

展开理解就是首先,在n个记录中选择最小者放到r[1]位置;然后,从剩 余的n-1个记录中选择最小者放到r[2]位置;…如此进行下去,直到全部有序为止。

例:T=(21,25,49,25*,16,08)

image.png

算法

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

堆排序

堆的定义

image.png

如果让满足以上条件的元素序列(k1,k2,…,kn)顺次排成一棵完全二叉树,则此树的特点是: 树中所有根结点的值均大于(或小于)其左右孩子,此树的根结点(即堆顶)必最大(或最小)

怎样建立堆

从最后一个非终端结点开始往前逐步调整,让每个 双亲大于(或小于)子女,直到根结点为止。

进行堆排序

关键的问题在于:将堆的当前顶点输出后,如何将剩余序列重新调整为堆。

解决:将当前顶点与堆尾记录交换,然后仿建堆动作,从上至下新调整,如此反复直至排序结束。