选择排序(简单选择排序、堆排序)

  • 选择排序
    • 简单选择排序
      • 概念
      • 算法实现
    • 堆排序
      • 概念
      • 算法实现
  • 后续

选择排序

选择排序的基本思想是:每一趟在待排序元素中选取关键字最小(或最大)的元素加入有序子序列。

简单选择排序

概念

假设排序表为L[1…N],,第i趟排序即从L[1…N]中选择关键字最小的元素与L(i)交换,每一趟排序可以确定一个元素的最终位置,这样经过n-1趟排序就可以使得整个排序表有序。

算法实现

void select_sort(ElemType A[],int n)
{int i, j,min;for (i = 0; i < n-1; i++){min = i; //  记录最小元素位置for (j = i + 1; j < n; j++)  //在A【i...n-1】中选取最小的元素if (A[j] < A[min])min = j;         //更新最小元素位置if (min != i)swap(A[i],A[min]);      }
}

堆排序

概念

  1. 堆排序要结合顺序存储的完全二叉树的特性进行学习。
    对于完全二叉树而言:
  • 结点 i 的左孩子是 2i
  • 结点 i 的右孩子是 2i+1
  • 结点 i 的父节点是 i/2
  • 编号 <= n/2的结点都是分支结点
  1. n个关键字序列L[1…N]称为堆。
    当且仅当 L(i) >=L(2i) 且 L(i)>=L(2i+1) 可以将该一维数组视为一棵完全二叉树,满足此条件的堆称之为大根堆。大根堆的最大元素存放在根节点,且其任一非根节点的值小于等于其双亲结点值
    小根堆反之。
  2. 堆排序的思路很简单:首先将存放在L[1…N]中的N个元素建成初始堆,由于堆本身的特点(以大根堆为例),堆顶元素就是最大值。输出堆顶元素后,通常将堆底元素送入堆顶,此时根节点已不满足大顶堆的性质,对被破坏,将堆顶元素向下调整使其继续保持大顶堆的性质,再输出堆顶元素。如此重复,直到堆中仅剩一个元素为止。
  3. 构建初始堆的方法:先对完全二叉树的最右下边的子树调整,使其成为堆(如果此节点的孩子有比他大的,则将最大的孩子和父节点调换),之后向前依次对各节点([N/2]-1~1)为根的子树进行筛选,看该节点是否大于其左右孩子的值,若不大于则交换,交换后可能会破坏下一级的堆,于是采用上述方法继续构建下一级的堆,直到以该节点为根的子树构成堆为止。反复利用上述调整堆的方法建堆,直到根节点。

算法实现

void Build_Max_Heap(ElemType A[],int len)
{   //构建大根堆int i;for (int i = len / 2; i > 0; i--)  //从i=[n/2]~1,反复调整堆HeadAdjust(A,i,len);
}void HeadAdjust(ElemType A[],int k,int len)
{//将元素k为根的子树进行调整int i;A[0] = A[k]; //A[0]暂存子树的根节点for (i = 2 * k; i <= len; i*=2) //沿key较大的子节点向下筛选{if (i < len && A[i] < A[i + 1]){i++;  //取较大的子节点的下标}if (A[0] >= A[i])break;    //筛选结束else{A[k] = A[i];//将A[i]调整到双亲结点上k = i;//修改k值,以便继续向下筛选}}A[k] = A[0]; //被筛选结点的值放入最终位置
}void Heap_Sort(ElemType A[],int len)
{//堆排序int i;Build_Max_Heap(A,len);//初始建堆for (i = len; i > 1; i++) //n-1趟的交换和建堆过程{swap(A[i],A[1]); //输出堆顶元素(和堆底元素互换)HeadAdjust(A,1,i-1);//调整,把剩余的i-1个元素整理成堆}
}


后续

如果想了解更多物联网、智能家居项目知识,可以关注我的程序设计专栏。
订阅专栏后,可以在微信公众号上私聊我,直接发给你源码。
或者关注公众号。

编写不易,感谢支持。

排序算法之选择排序(简单选择排序、堆排序)相关推荐

  1. 【排序算法】冒泡排序、简单选择排序、直接插入排序比较和分析

    [排序算法]冒泡排序.简单选择排序.直接插入排序比较和分析 写在前面: 本文简单介绍了冒泡排序.简单选择排序.直接插入排序,并对这三种排序进行比较,入参都是80000个随机数,比较算法耗时.进一步,我 ...

  2. 《排序算法系列一、简单选择排序》

    2019独角兽企业重金招聘Python工程师标准>>> 一.简单选择排序 描述:给定待排序序列A[ 0......n ] ,选择出第i小元素,并和A[i]交换,这就是一趟简单选择排序 ...

  3. C语言——十四种内部排序算法【直接插入排序-冒泡排序-选择排序-插入排序-希尔排序-归并排序-快速排序-堆排序-折半插入排序-二分查找-路插入排序-表插入排序-简单选择排序-直接选择排序-树形选择】

    目录: 一:插入排序 A:直接插入排序 1.定义: 2.算法演示 实例1: 3.基本思想 4.排序流程图 实例1: B:希尔排序 1.定义: 2.算法演示 实例2: C:其他插入排序 a:折半插入排序 ...

  4. 对以下6种常用的内部排序算法进行比较:起泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、堆排序。

    题目要求: (1)对以下6种常用的内部排序算法进行比较:起泡排序.直接插入排序.简单选择排序.快速排序.希尔排序.堆排序. (2)待排序表的表长不小于100:其中的数据要用伪随机数产生程序产生:至少要 ...

  5. python 按条件选择行和列数据_小白学数据结构-排序算法Python(冒泡、选择、快速、希尔等等)...

    排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们通常所说的排序算法往往指的是内部排序算法,即数据 ...

  6. Java 与排序算法(2):选择排序

    一.选择排序 选择排序(Selection Sort)是一种简单的排序算法,其基本思想是在待排序序列中选择最小(或最大)的元素,将其与序列的第一个元素交换位置,然后在剩余的元素中继续选择最小(或最大) ...

  7. JavaScript 几种排序算法实现(冒泡、选择、插入、归并、快速排序)

    1. 冒泡 // 冒泡 - 每次循环, 将两两中偏大的元素移动到右边 for (let i = 0; i < arr.length - 1; i++) {for (let j = i; j &l ...

  8. 通讯录排序 (20分)_算法入门篇:简单的排序算法

    作者:dorseyCh来源:http://www.imooc.com/article/264180 很久之前有过一次面试,被问到一个问题,能不能写一个冒泡排序?说实话,尽管在这之前曾经写过不少比这个更 ...

  9. 【排序算法】python 十大经典排序算法(全网最详)

    排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存.常见的内部排序算法有:插入排序.希尔排序.选 ...

  10. 九大排序算法告诉你什么是内部排序和外部排序

    概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们通常所说的排序算法往往指的是内部排序算法, ...

最新文章

  1. 文件格式 tar.gz zip zp2 zip rar
  2. ubuntu16禁用utc时间
  3. SQL基础--完整性约束
  4. 现行高考政策公平 辩论_为这些考生高考加20分?这样的政策对其他考生公平吗?榕和奉献...
  5. SpringBoot_数据访问-整合MyBatis(一)-基础环境搭建
  6. 蓝桥杯 - 连号区间数(暴力)
  7. 牛客网-数据结构笔试题目(五)-动态规划问题求解
  8. 直播PK短视频?直播+短视频才是王道
  9. 【Unity】UGUI无法修改字体大小
  10. 信息学奥赛一本通(1061:求整数的和与均值)
  11. mysql left join 中文_MySQL之LEFT JOIN问题汇总
  12. ssis zip压缩文件_SSIS平面文件与原始文件
  13. MySQL MHA切换失败一例
  14. Sentaurus 入门之二视频教程合集
  15. MFC之菜单栏的相关使用14
  16. 开发板BMP图片显示(6818开发板)
  17. Mysql(下载、安装、环境配置详细图文)
  18. 说说各种手机输入法的体验
  19. 数据库技术在项目中的应用?
  20. Qt Widgets

热门文章

  1. ab plc软件_【原创】AB上位机FactoryTalk View的使用教程(上)
  2. Angular.js学习-入门
  3. TensorFlow——实现线性回归算法
  4. bzoj3550: [ONTAK2010]Vacation1283: 序列
  5. mysqld 多线程 用pstree -p 显示
  6. Contact Manager Web API 示例[4] 异常处理(Exception Handling)
  7. 如何去掉子窗体的关闭按钮.右上角的那个X
  8. Flutter打包安卓提示请使用 -Xlint:deprecation 重新编译、请使用 -Xlint:unchecked 重新编译
  9. Flutter MaterialButton 实现圆角边框按钮
  10. 分布式系统关注点(2)——烦人的数据不一致问题到底怎么解决?——通过“共识”达成数据一致性...