八大排序算法之选择排序算法
文章目录
- 一:简单选择排序算法
- 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;}}
}
八大排序算法之选择排序算法相关推荐
- 数据结构与算法:选择排序
数据结构与算法:选择排序 雪柯 大工生物信息 提笔为写给奋进之人 已关注 8 人赞同了该文章 引用自算法图解,作者[美] Aditya Bhargava 译袁国忠 特别备注:本书非原创,但部分内容自己 ...
- 排序---初级排序算法(选择排序、插入排序和希尔排序)
写在前面的话: 一枚自学Java和算法的工科妹子. 算法学习书目:算法(第四版) Robert Sedgewick 算法视频教程:Coursera Algorithms Part1&2 本文 ...
- 函数模板案例_利用函数模板封装一个排序的函数,可以对不同数据类型数组进行排序 排序规则从大到小,排序算法为选择排序 分别利用char数组和int数组进行测试
案例描述: 利用函数模板封装一个排序的函数,可以对不同数据类型数组进行排序 排序规则从大到小,排序算法为选择排序 分别利用char数组和int数组进行测试 #include <iostream& ...
- 排序算法 | 直接选择排序,算法的图解、实现、复杂度和稳定性分析
排序算法 | 直接选择排序,算法的图解.实现.复杂度和稳定性分析 目录 1.直接选择排序的原理 2.图解直接选择排序 3.算法代码实现 4.算法复杂度分析.稳定性分析 直接选择排序 1.直接选择排序的 ...
- php三个数字比较大小排序,php中常用的4种实现数字大小排序的冒泡选择等算法函数代码...
分别用冒泡排序法,快速排序法,选择排序法,插入排序法将下面数组中按照从小到大的顺序进行排序. 本站收录这篇文章php中常用的4种实现数字大小排序的冒泡选择等算法函数代码,详细解说文章中相关排序 冒泡 ...
- 数据结构与算法之选择排序
数据结构与算法之选择排序 目录 基本介绍 选择排序思想 代码实现 1. 基本介绍 选择排序也属于内部排序法,是从排序的数据中,按指定的规则选出某一元素,再依次交换位置后达到排序的目的 2. 选择排序思 ...
- 堆排序算法c语言筛选法,【排序】排序算法之选择排序
排序算法之选择排序 罗朝辉(http://www.cppblog.com/kesalin) 转载请注明出处 排序是数据处理中经常使用的一种重要运算,在计算机及其应用系统中,花费在排序上的时间在系统运行 ...
- 选择排序算法流程图_常用排序算法之选择排序
前两天给大家分享了冒泡排序和插入排序(没关注的同学,可以关注后查看历史消息),今天继续给大家分享另一种常用的排序算法--选择排序. 选择排序 选择排序和插入排序很相似,也区分已排序区间和未排序区间,选 ...
- 排序算法之选择排序(简单选择排序、堆排序)
选择排序(简单选择排序.堆排序) 选择排序 简单选择排序 概念 算法实现 堆排序 概念 算法实现 后续 选择排序 选择排序的基本思想是:每一趟在待排序元素中选取关键字最小(或最大)的元素加入有序子序列 ...
- JavaScript算法 之 选择排序
原文来自:微信公众号HTML5学堂 算法的基本概念 算法是什么,它有何作用 为解决一个问题而采取的方法和步骤,称为算法. 我们可以把算法看成一本"福字剪纸教程",其中每一种算法就是 ...
最新文章
- 探索强化学习算法背后的思想起源!
- JQuery轻量级网页编辑器 选中即可编辑
- python获取天气信息写入原有的excel文档
- 计算机硬件的维护知识,电脑放了一年开不了机 电脑硬件维护常识要点有哪些...
- java字符流和字节流的区别_java字符流与字节流的区别是什么
- JS任务队列--笔记
- micropython flask_在Python的Flask框架中实现单元测试的教程
- 【CSS3】 理解CSS3 transform中的Matrix(矩阵)
- 在Blazor中构建数据库应用程序——第2部分——服务——构建CRUD数据层
- 为什么要使用计算机协议,为什么需要网络协议
- JSP基于JDBC操作MSSQL2008数据库
- Ace在线代码编辑器使用
- 搞懂:1.数据流图UML2.单代号网络图绘制3.双代号网络图绘制、工作计算法、关键路径法(含例题)
- 围成面积(信息学奥赛一本通 - T1359)
- Phalcon 上传文件
- 安卓虚拟键盘_安卓这些年变化多惊人?那些老玩家才懂的回忆
- 任务栏微信图标显示为白框,解决办法
- 车路协同云/边缘云服务平台概要【原创】
- Linux 中安装宋体字体
- mysql 多表 left join_MySql left join 多表连接查询优化语句
热门文章
- DotLiquid模板引擎简介
- Vue中render: h = h(App)的含义
- byte java byte_详解java中的byte类型
- 定量遥感:计算地方时和太阳高度角(C++代码)
- C++ throw:抛出自己的异常
- Android之React native的介绍和入门指南
- java中hasnext的作用_java中Scanner的hasNext()的疑问
- 一个类可以实现多个接口吗_Java入门:基础知识(面向对象:接口)
- mysql分页存储过程 分页查询语句_分页存储过程(用存储过程实现数据库的分页代码)...
- 软件项目组织管理(五)项目范围管理