八大排序算法之选择排序算法


文章目录

  • 一:简单选择排序算法
    • 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;}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/307477.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

快速了解 ASP.NET Core Blazor

最近在几个微信 .NET 交流群里大家讨论比较频繁的话题就是这几天自己的面试经历。面试官&#xff1a;“你刚说你喜欢研究新技术&#xff0c;那你有了解过 Blazor 吗&#xff1f;”作为一位专注于 .NET 开发的软件工程师&#xff0c;你好意思说你对 Blazor 一点也不解吗&#xf…

ASP.NET Core集成Nacos配置中心之适配多格式配置

前言 默认情况下&#xff0c;用nacos-sdk-csharp集成ASP.NET Core的配置系统&#xff0c;是基于JSON格式的数据。随着业务系统的多样化&#xff0c;可能用的配置格式也是各有千秋的。有的会用yaml/yml&#xff0c;有的会用ini&#xff0c;有的会用xml&#xff0c;等等。那么如果…

Git的使用(快速入门)

文章目录[TOC]一:将本地的项目提交到Git上二:GIt的基本操作1:建立一个本地仓库(1):类别(2):创建全新的仓库(3):克隆远程仓库2:查看文件的状态3:在桌面上的文件提交到远程仓库4:在idea中的文件提交到远程仓库5:分支(1):何为分支(2):常用命令(3)注意6:解决合并冲突(1):问题展示(2…

为什么这么忙,还依然做不好事情?

一直都很喜欢《重来》系列&#xff0c;最近出了《重来3&#xff1a;跳出疯狂的忙碌》&#xff0c;第一时间在微信读书中阅读了&#xff0c;让我们印象比较深刻的就是「冷静」和「效率」&#xff0c;本文主要说说效率的问题。书的作者是贾森弗里德&#xff08;Jason Fried&#…

开源特训营 - Lesson 6 - 如何提交一个合格的PR

编辑&#xff1a;李明康责编&#xff1a;袁睿斌作者&#xff1a;课程助教 - 苏斌主讲教师&#xff1a;张齐勋&#xff08;北京大学&#xff09;、赵生宇&#xff08;同济大学&#xff09;本次课程的主题为《如何提交一个合格的PR》&#xff0c;主讲者为来自北京大学的张齐勋老师…

八大排序算法交换排序算法

一:冒泡排序 1:冒泡排序思想 从第一个元素开始&#xff0c;依次比较数组中的元素&#xff0c;如果比其小就交换(如果是升序的话)&#xff0c;经过n-1轮排序后我们就可以得到有序序列了 2:上码 版本一 public static void bubblingSort(int[] arr) {for (int i 0; i < …

改进程架构,Edge优化浏览器内存问题

微软 Edge 团队称&#xff0c;“今天的浏览器更像是操作系统&#xff0c;而不是文档查看器。用户正在浏览器中执行越来越多的任务&#xff0c;而在桌面应用程序中执行的任务越来越少。与此同时&#xff0c;每个网页、Web 应用程序和扩展程序都在使用内存&#xff0c;这也会使用…

中芯国际第二代FinFET工艺有望与2020年底试产

媒体报道&#xff0c;第一代FinFET 14纳米已于2019年四季度量产&#xff1b;第二代FinFET N1已进入客户导入阶段&#xff0c;可望于2020年底小批量试产。梁孟松披露&#xff0c;中芯国际的下一代N1工艺和14nm相比&#xff0c;性能提升了20%&#xff0c;功耗降低了57%&#xff0…

gRPC-微服务间通信实践

微服务间通信常见的两种方式由于微服务架构慢慢被更多人使用后&#xff0c;迎面而来的问题是如何做好微服务间通信的方案。我们先分析下目前最常用的两种服务间通信方案。gRPC&#xff08;rpc远程调用&#xff09;场景&#xff1a;A服务主动发起请求到B服务&#xff0c;同步方式…

移动 Azure 资源后如何快速修复 Dashboard

点击上方蓝字关注“汪宇杰博客”导语Azure 用户经常因为不够有钱&#xff0c;需要把资源移动到另一个资源组或订阅中。移动完成后&#xff0c;会导致资源对应的 Dashboard 失效。通常&#xff0c;我们都需要从 Dashboard 上将找不到的资源删除&#xff0c;并逐个重建。有没有快…

Linux中 安装centos-release-scl 报错No package centos-release-scl available.

一:我是想干什么 我在升级gcc版本的时候遇见了这个问题 二:如何解决的呢 rpm -ivh https://cbs.centos.org/kojifiles/packages/centos-release-scl-rh/2/3.el7.centos/noarch/centos-release-scl-rh-2-3.el7.centos.noarch.rpmrpm -ivh https://cbs.centos.org/kojifiles/p…

八大排序算法之插入排序

一:直接插入排序 1:思想 首先选择一个哨兵,我们默认将第一个数作为哨兵,随着循环的进行,我们一直将我们待插入数的前一个数作为哨兵然后就是插入的数与哨兵比较&#xff0c;比哨兵小的话&#xff0c;就将哨兵后移&#xff0c;然后再与哨兵前面的数进行比较&#xff0c;直到遇…

跟我一起学Redis之五种基本类型及其应用场景举例(干了6个小时)

前言来啦&#xff0c;老弟&#xff1f;来啦&#xff0c;上一篇就当唠唠嗑&#xff0c;接下来就开始进行实操撸命令&#xff0c;计划是先整体单纯说说Redis的各种用法和应用&#xff0c;最后再结合代码归纳总结。Redis默认有16个数据库(编号为0~15)&#xff0c;默认使用第0个&am…

leetcode周赛6070. 计算字符串的数字和

一:题目 二:上码 class Solution { public:/**思路:1.设置一个while循环&#xff0c;循环的条件是s.length<k2.while里面进行 1>:将字符串按k个进行拆分成个单个字符&#xff0c;并将其转换成数字,然后计算将计算结果再组成字符串 */string digitSum(string s, int k) {…

ASP.NET Core 中的 User Agent 识别及搜索引擎爬虫鉴定方法

User Agent中文名为用户代理&#xff0c;简称 UA&#xff0c;它是一个特殊字符串头&#xff0c;使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。百度百科在 ASP.NET Core 中&#xff0c;可以通过以下代码在 …

leetcode周赛6071. 完成所有任务需要的最少轮数

一:题目 二:上码 class Solution { public:/**思路:1.如果x1的话,那么的话 直接返回-12.如果x2的话&#xff0c;那么就一次执行3.如果x是3的倍数的话,那么就直接执行 x/3 次4.如果x/3 余数是1的话 那就执行 x/31,比方说是4 其实是两个2&#xff0c;但是我们求数的的时候,我们求…

netcore使用 jenkins + supervisor 实现standalone下多副本自动化发布

前面的文章聊过用 jenkins 做了一个简单的自动化发布&#xff0c;在shell中采用的是 BUILD_IDdontKillMe nohup dotnet xxx.dll & 这种简单的后台承载&#xff0c;如果你的业务量相对比较小&#xff0c;可以用这个方法玩一玩&#xff0c;但存在二个问题&#xff1a;1. 无法…

实战解读ASP.NET Core身份认证

长话短说&#xff1a;上文我们聊了 ASP.NET Core 基于声明的访问控制到底是什么鬼&#xff1f;今天我们乘胜追击&#xff1a;聊一聊ASP.NET Core 中的身份验证。身份验证是确定用户身份的过程。授权是确定用户是否有权访问资源的过程。1. 万变不离其宗显而易见&#xff0c;一个…

Java并发之AQS

文章目录一:AQS简介二:了解AQS 上锁和释放锁的原理1:前言2:上锁(非公平锁)(1):我们从main主函数中点进去(2):从lock进入(3):找到非公平锁中的lock(4):查看acquire()方法(5):查看tryAcquire(arg)方法a:前言介绍b:进入ReentrantLock类中的nonfairTryAcquire方法(6):addWaiter(Nod…

网络知识 | 《图解TCP/IP》读书笔记(上)

【网络知识】| 作者 / Edison Zhou这是EdisonTalk的第290篇原创内容作为一个专业的IT技术人&#xff0c;一个Web应用开发者&#xff0c;不了解网络基础和协议&#xff0c;怎么能行&#xff1f;本文是我2016年阅读《图解TCP/IP》一书的读书笔记&#xff0c;希望对你有所帮助&…