文章目录

  • 一:简单选择排序算法
    • 1:思想
      • (1):概念
      • (2):举例验证
    • (3):上码
      • (3):时间复杂度和稳定性
  • 二:堆排序
    • 1:什么是堆
    • 2:堆排序的原理(以升序序列为例)
    • 3:堆排序算法的具体过程
      • (1):先将无序序列建成一个堆
      • (2):调换堆顶元素后,再调整剩下的元素为一个新的堆
    • 4:上码
      • (1):heapSort函数
      • (2):adjustHeap函数(调整数组为大顶堆)

一:简单选择排序算法

1:思想

(1):概念

  • 总共有n个数,同时下标是从0到n-1;
  • 我们要进行n-1趟的交换
  • 每一趟在 (n-i)-1个记录中寻找出最小值(也就是找出该数组下标后面数中的最小值),与i下标所代表的值进行比较,如果比其小那么就进行交换(前提我们是求得是升序)。

(2):举例验证

  • 文字验证
    第一次从 arr[1]~arr[n-1]中选取最小值,与 arr[0]作比较 判断是否交换

第二次从 arr[2]~arr[n-1]中选取最小值,与 arr[1]作比较 判断是否交换

第三次从 arr[3]~arr[n-1]中选取最小值,与 arr[2]作比较 判断是否交换

第 i 次从 arr[i]~arr[n-1]中选取最小值,与 arr[i-1]作比较 判断是否交换

第 n-1 次从 arr[n-1]~arr[n-1]中选取最小值,与 arr[n-2]作比较 判断是否交换

总共是要进行n-1轮


  • 实例验证
原始数组: 4 3 5 1
第一轮排序: 1 3 2 4
第二轮排序: 1 3 5 4
第三轮排序: 1 3 4 5说明:
1.总共进行n-1轮排序
2.每一轮排序又是新的循环,循环得规则是2.1:我们先假定当前数是最小的,并记录

(3):上码

public static void simpleSort(int [] arr) {for (int i = 0; i < arr.length-1; i++) {//表示轮数int min = arr[i];int minIndex = i;for (int j = i+1; j < arr.length; j++) {//寻找i后面数的最小值if (arr[j] < min) {min = arr[j];minIndex = j;}}if (i != minIndex) {//交换当前下标i代表的数和求出的arr[minIndex] = arr[i];arr[i] = min;}}}

(3):时间复杂度和稳定性

  • O(n^2)
  • 不稳定

二:堆排序

1:什么是堆

堆是具有下列性质的完全二叉树,每个结点的值都大于或等于其左右结点的的值,称为大顶堆;

每个结点值都小于等于其左右节点的值称为小顶堆。

2:堆排序的原理(以升序序列为例)

  • 首先将无序序列中n个元素构造成一个大顶堆
  • 此时整个序列的最大值就是根节点
  • 然后将根节点和和数组中的末尾元素进行交换,那么此时最后的元素就是最大值
  • 然后再将剩余的的n-1个元素,重新进行调整,然后构造成一个大顶堆,如此反复进行,我们最终就会得到一个有序序列了

3:堆排序算法的具体过程

(1):先将无序序列建成一个堆

for(int i = arr.length/2-1; i >= 0; i--) {//这里的arr.length/2-1,是求出adjustHeap(arr,i,arr.length);      //完全二叉树中最后一个非叶节点的下标。
}

(2):调换堆顶元素后,再调整剩下的元素为一个新的堆

for(int i = arr.length-1; i > 0; i--) {//交换跟根节点和数组最后的元素的值,(这里最后的值是不断往前的)int temp = arr[0];arr[0] = arr[i];arr[i] = temp;    //调整n-i个元素为一个大顶堆    adjustHeap(arr,0,i-1);
}

4:上码

(1):heapSort函数

//heapSort函数 (调整无序序列为大顶堆;将堆顶元素和数组最后的元素进行交换,然后将剩下的元素重新调整为大顶堆)
public static void heapSort1(int arr[]) {//调整无序序列为大顶堆;for (int i = arr.length/2-1; i >= 0 ; i--) {adjustHeap(arr,i, arr.length-1);}//将堆顶元素和数组最后的元素进行交换,然后将剩下的元素重新调整为大顶堆(经过n-1次循环我们将得到一个升序的序列)for (int i = arr.length-1; i > 0 ; i--) {int temp = arr[0];arr[0] = arr[i];arr[i] = temp;adjustHeap(arr,0,i-1);//从 根结点开始重新调整为大顶堆}
}

(2):adjustHeap函数(调整数组为大顶堆)

//adjustHeap(向下调整)
public static void adjustHeap(int arr[],int index,int length) {//k = 2 * index + 1 表示的是左节点, k = 2*index + 2表示的是右结点for (int k = 2*index+1; k <= length ; k = k * 2 + 1) {//比较该结点的左右孩子结点的值谁大if (k+1 <= length &&arr[k] < arr[k+1]) k++;//右结点值比较大if (arr[k] > arr[index]) { //子结点的值比父节点值大的话int temp = arr[index];//需要调整的根节点arr[index] = arr[k];//那就孩子结点跟父节点进行交换arr[k] = temp;index = k;//更新index,将孩子结点作为新的根节点继续往下进行比较} else {break;}}
}

八大排序算法之选择排序算法相关推荐

  1. 数据结构与算法:选择排序

    数据结构与算法:选择排序 雪柯 大工生物信息 提笔为写给奋进之人 已关注 8 人赞同了该文章 引用自算法图解,作者[美] Aditya Bhargava 译袁国忠 特别备注:本书非原创,但部分内容自己 ...

  2. 排序---初级排序算法(选择排序、插入排序和希尔排序)

    写在前面的话: 一枚自学Java和算法的工科妹子. 算法学习书目:算法(第四版) Robert Sedgewick 算法视频教程:Coursera  Algorithms Part1&2 本文 ...

  3. 函数模板案例_利用函数模板封装一个排序的函数,可以对不同数据类型数组进行排序 排序规则从大到小,排序算法为选择排序 分别利用char数组和int数组进行测试

    案例描述: 利用函数模板封装一个排序的函数,可以对不同数据类型数组进行排序 排序规则从大到小,排序算法为选择排序 分别利用char数组和int数组进行测试 #include <iostream& ...

  4. 排序算法 | 直接选择排序,算法的图解、实现、复杂度和稳定性分析

    排序算法 | 直接选择排序,算法的图解.实现.复杂度和稳定性分析 目录 1.直接选择排序的原理 2.图解直接选择排序 3.算法代码实现 4.算法复杂度分析.稳定性分析 直接选择排序 1.直接选择排序的 ...

  5. php三个数字比较大小排序,php中常用的4种实现数字大小排序的冒泡选择等算法函数代码...

    分别用冒泡排序法,快速排序法,选择排序法,插入排序法将下面数组中按照从小到大的顺序进行排序. 本站收录这篇文章php中常用的4种实现数字大小排序的冒泡选择等算法函数代码,详细解说文章中相关排序 冒泡 ...

  6. 数据结构与算法之选择排序

    数据结构与算法之选择排序 目录 基本介绍 选择排序思想 代码实现 1. 基本介绍 选择排序也属于内部排序法,是从排序的数据中,按指定的规则选出某一元素,再依次交换位置后达到排序的目的 2. 选择排序思 ...

  7. 堆排序算法c语言筛选法,【排序】排序算法之选择排序

    排序算法之选择排序 罗朝辉(http://www.cppblog.com/kesalin) 转载请注明出处 排序是数据处理中经常使用的一种重要运算,在计算机及其应用系统中,花费在排序上的时间在系统运行 ...

  8. 选择排序算法流程图_常用排序算法之选择排序

    前两天给大家分享了冒泡排序和插入排序(没关注的同学,可以关注后查看历史消息),今天继续给大家分享另一种常用的排序算法--选择排序. 选择排序 选择排序和插入排序很相似,也区分已排序区间和未排序区间,选 ...

  9. 排序算法之选择排序(简单选择排序、堆排序)

    选择排序(简单选择排序.堆排序) 选择排序 简单选择排序 概念 算法实现 堆排序 概念 算法实现 后续 选择排序 选择排序的基本思想是:每一趟在待排序元素中选取关键字最小(或最大)的元素加入有序子序列 ...

  10. JavaScript算法 之 选择排序

    原文来自:微信公众号HTML5学堂 算法的基本概念 算法是什么,它有何作用 为解决一个问题而采取的方法和步骤,称为算法. 我们可以把算法看成一本"福字剪纸教程",其中每一种算法就是 ...

最新文章

  1. 探索强化学习算法背后的思想起源!
  2. JQuery轻量级网页编辑器 选中即可编辑
  3. python获取天气信息写入原有的excel文档
  4. 计算机硬件的维护知识,电脑放了一年开不了机 电脑硬件维护常识要点有哪些...
  5. java字符流和字节流的区别_java字符流与字节流的区别是什么
  6. JS任务队列--笔记
  7. micropython flask_在Python的Flask框架中实现单元测试的教程
  8. 【CSS3】 理解CSS3 transform中的Matrix(矩阵)
  9. 在Blazor中构建数据库应用程序——第2部分——服务——构建CRUD数据层
  10. 为什么要使用计算机协议,为什么需要网络协议
  11. JSP基于JDBC操作MSSQL2008数据库
  12. Ace在线代码编辑器使用
  13. 搞懂:1.数据流图UML2.单代号网络图绘制3.双代号网络图绘制、工作计算法、关键路径法(含例题)
  14. 围成面积(信息学奥赛一本通 - T1359)
  15. Phalcon 上传文件
  16. 安卓虚拟键盘_安卓这些年变化多惊人?那些老玩家才懂的回忆
  17. 任务栏微信图标显示为白框,解决办法
  18. 车路协同云/边缘云服务平台概要【原创】
  19. Linux 中安装宋体字体
  20. mysql 多表 left join_MySql left join 多表连接查询优化语句

热门文章

  1. DotLiquid模板引擎简介
  2. Vue中render: h = h(App)的含义
  3. byte java byte_详解java中的byte类型
  4. 定量遥感:计算地方时和太阳高度角(C++代码)
  5. C++ throw:抛出自己的异常
  6. Android之React native的介绍和入门指南
  7. java中hasnext的作用_java中Scanner的hasNext()的疑问
  8. 一个类可以实现多个接口吗_Java入门:基础知识(面向对象:接口)
  9. mysql分页存储过程 分页查询语句_分页存储过程(用存储过程实现数据库的分页代码)...
  10. 软件项目组织管理(五)项目范围管理