数据结构之排序了如指掌(二)

目录

题外话

正题

选择排序

选择排序思路

选择排序代码详解

选择排序复杂度

双向选择排序

双向选择排序思路

双向选择排序代码详解

堆排序

堆排序思路

堆排序代码详解

堆排序复杂度

冒泡排序

冒泡排序思路

冒泡排序代码详解

冒泡排序复杂度

小结


题外话

今天状态超级好,废话不说直接写博客!!

先说下,我会尽力将博客中的各种问题,通过文字和图形和代码结合的方式让大家更直观清晰的去理解,毕竟写博客不是看视频,我只能尽量让大家明白这些知识

想学的人自然会去琢磨,不想学的人你就喂到他嘴里,他都不想咀嚼一下

正题

上篇我们写完了直接插入排序和希尔排序,让我们继续写排序内容

选择排序

选择排序思路

创建i和j

i从0下标开始,j从i+1开始

j在数组中寻找剩余元素的最小值

找到之后把最小值和i交换

循环此过程,直到i走到数组倒数第1个元素结束,倒数第一个元素不需要再排序,因为前面都排序完成,最后一个肯定是有序的

觉得上面讲的不清晰可以看下图

选择排序代码详解

public void selectSort(int[] arr)
{//创建tmp作为临时变量,swap作为交换变量int tmp;int swap;
//i从0下标开始,i走到倒数第二个元素排完序就结束,最后一个元素必然有序!!for (int i=0;i<arr.length-1;i++) {//tmp是记录最小元素下标值,先将i下标放入tmp中tmp=i;//j下标就等于i+1int j = i + 1; //j每趟肯定是从i+1开始到数组最后一个元素结束for (; j <arr.length; j++) {   //当tmp中元素大于j中元素,就说明tmp不是剩余数组中最小的元素if (arr[tmp] > arr[j]) { //将j下标传给tmptmp = j;}} //如果i==tmp说明i此时就是剩余数组元素中最小的,不需要再交换位置     //否则再交换位置if(i!=tmp){swap = arr[tmp];arr[tmp] = arr[i];arr[i] = swap;}}
}

选择排序复杂度

时间复杂度:O(n^2)无论数组是否有序,i都会从0下标开始到arr.length-2下标结束

j总共会走n-1,n-2,n-3,.......1,相当于等差数列,所以计算出来为O(n^2)

空间复杂度:O(1),因为就一个数组

稳定性:不稳定,相同元素的位置可能会改变

双向选择排序

上面属于是单向的选择排序,下面我们说说另一个版本双向选择排序

双向选择排序思路

1.创建left,right两个变量,让left从0下标开始向后面走,让right从arr.lenght-1开始向前面走

2.创建minIndex,和maxIndex两个变量,并把left下标传给这两个变量

3.i从letf+1下标往后走,如果遇到比minIndex小的下标元素,就把i下标传给minIndex

4.如果遇到比maxIndex大的下标元素,就把i下标传给maxIndex

5.最后minIndex中的元素一定是剩余数组中最小的元素,maxIndex中的元素一定是剩余数组中最大的元素

6.将minIndex中的元素与left交换,maxIndex中的元素与right交换

7.left++,right--,循环上述过程,最后数组实现从小到大排序

注意!!! 如下图

双向选择排序代码详解

public void DoubleSelectSort(int[] arr)
{//创建left让其指向0下标int left=0; //创建right让其指向arr.length-1下标int right=arr.length-1;//left等于right说明排序已经结束,所以left小于rightwhile (left<right) {   //创建minIndex和maxIndex每次循环将left传给他们int minIndex=left;int maxIndex=left;//i从left+1开始,每趟到right结束,一定要包括right所以i小于等于rightfor (int i = left + 1; i <= right; i++) {//如果遇到i下标元素值小于minIndex下标元素值,说明minIndex不是剩余数组元素最小值,将i传给minIndexif (arr[i] < arr[minIndex]) {minIndex = i;} //如果遇到i下标元素值大于maxIndex下标元素值,说明maxIndex不是剩余数组元素最大值,将i传给maxIndexif (arr[i] > arr[maxIndex]) {maxIndex = i;}}//将最小值和left交换swap(arr,left,minIndex);  //如果maxIndex==left的话,而且left在上面已经和minIndex交换了if (maxIndex==left){ //我们需要将left交换的mainIndex传入maxIndex,这样maxIndex才是我们需要的maxIndex=minIndex;} //将最大值和right交换swap(arr,right,maxIndex);//left往前继续排序left++; //right往后继续排序right--;}
}
//下标元素交换代码
public void swap(int[] arr,int a,int b)
{int tmp=arr[a];arr[a]=arr[b];arr[b]=tmp;
}

堆排序

堆排序思路

1.先向下调整创建大根堆

2.堆排序,创建好的大根堆,堆顶元素和最后一个没有交换过位置的元素交换位置,然后将没有交换位置的元素,再向下调整成大根堆,然后循环这个过程

之前在堆的那篇博客中讲过堆排序这里就不说太多

堆排序代码详解

//建立大根堆
private void creatHeap(int[] arr){//父亲结点从最后往上依次建立大根堆for (int parent=(arr.length-1-1)/2;parent>=0;parent--){//向下调整成大根堆siftDown(arr,parent,arr.length);}}//向下调整private void siftDown(int[] arr,int parent,int len){//找到孩子节点int child=parent*2+1;//孩子节点一定不能超过数组元素数量while (child<len){//孩子结点+1也不能超过数组元素数量并且child下标元素小于child+1下标元素if (child+1<len&&arr[child]<arr[child+1]){//child++,child指向孩子中最大的那个child++;}//如果孩子中最大的那个大于父亲结点if (arr[child]>arr[parent]){//交换父亲和孩子结点的位置swap(arr,parent,child);//继续向下调整parent=child;child=parent*2+1;}else//如果孩子中最大的不大于父亲结点则说明建立成大根堆,直接退出{break;}}}//从小到大排序,堆排序public void heapSort(int[] arr){ //创建成大根堆creatHeap(arr);//从最后一个结点开始int end=arr.length-1;//当end>0的时候while (end>0) {//交换堆顶元素和最后一个元素位置,这样end位置会是整个堆最大的元素swap(arr,0,end);//向下排序,把除去end下标的往后元素,建立成大根堆siftDown(arr,0,end);//end--继续循环end--;}}

堆排序复杂度

时间复杂度:O(n*logn),

建立大根堆时间复杂度为O(n),

而堆排序交换堆顶元素和最后一个没有交换元素的位置(交换n次)并且要向下调整为大根堆(相当于根的深度也就是logn),时间复杂度为O(nlogn)

所以时间复杂度为O(nlogn)

空间复杂度:o(1),就一个数组

稳定性:不稳定,相同元素的位置可能会改变

冒泡排序

冒泡排序思路

1.如果相邻的两个元素,前面的大于后面的元素,那么就把这两个元素调换位置
2.继续往后走,按照以上的方式进行循环,可以保证每一趟最后一个元素一定是数组中最大的元素
3.n个元素要走n-1趟

上面看不懂请看下图

冒泡排序代码详解

public void bubbleSort(int[] arr)
{
//i为趟数,n个元素只需要n-1趟
for (int i=0;i<arr.length-1;i++)
{//创建一个flg将false传入boolean flg=false;//莓走完一趟,最后一个元素一定为最大值,最后一个元素不需要再交换for (int j=0;j<arr.length-1-i;j++){//如果相邻元素前面的比后面的大if (arr[j]>arr[j+1]){//交换两个元素位置swap(arr,j,j+1);//如果交换顺序了,就把flg变为trueflg=true;}}//如果!flg为true则说明没有交换顺序,也就说明数组已经有序了,不需要再进行排序if (!flg)
{break;
}
}
}

冒泡排序复杂度

时间复杂度:O(n^2),j需要进行n+n-1+n-2+n-3......1次比较,等差数列,时间复杂度为O(n^2)

空间复杂度:O(1),就一个数组

稳定性:稳定,无论怎么交换顺序,相同的元素位置不会改变

小结

没想到会写这么久,画图还有逻辑梳理真的很需要时间,喜欢的家人们麻烦给我个三连(点赞关注收藏!!!!)

求求了!!

博主有不好的地方请在评论区留言或者私信,我都会虚心接受!!!


 

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

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

相关文章

变配电场所智能综合监控系统无人化与自动化升级改造

一 项目背景 国家电力建设飞速发展,为了提高管理水平,智能化建设迫在眉睫。变配电场所作为电网中的核心单元,数量巨大,是智能化建设的中坚部分。但由于变配电场所分布的地理位置过于分散&#xff0c;且配电网的自动化水平有待提高,单纯依靠人力来对变配电场所进行巡视,不仅增加…

【canvas】canvas综合运用:心形图案

#简言 利用canvas画出心形图案。 心形 心形图案可以两个椭圆相交组合&#xff0c;也可以直接画路径实现。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" conte…

labelimg安装和使用(解决闪退问题)

&#x1f308;个人主页&#xff1a;Rookie Maker &#x1f525; 系列专栏&#xff1a;计算机视觉 &#x1f3c6;&#x1f3c6;关注博主&#xff0c;随时获取更多关于IT的优质内容&#xff01;&#x1f3c6;&#x1f3c6; &#x1f600;欢迎来到我的代码世界~ &#x1f601; 喜…

图与图搜索算法

图搜索算法是一个非常重要的概念&#xff0c;它是计算机科学中图论和算法设计的基础部分。在开始讨论图搜索算法之前&#xff0c;我们需要先理解什么是图以及图的基本结构。 什么是图&#xff1f; 图&#xff08;Graph&#xff09;是一种非线性数据结构&#xff0c;它由一组点…

点云的投影------PCL

点云的投影 /// <summary> /// 参数化模型投影点云 /// </summary> /// <param name"cloud">点云</param> /// <param name"x">投影平面x面的系数</param> /// <param name"y"></param> /// &…

Python下利用Selenium获取动态页面数据

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

使用python进行网站答题操作

介绍&#xff1a; 使用Python和DrissionPage模块编写自动化脚本&#xff0c;以模拟人的行为访问网站并获取题目答案进行自动答题。这个脚本似乎是为答题网站设计的&#xff0c;通过监控特定数据包地址来获取题目答案&#xff0c;并模拟点击正确答案进行答题。 代码中的逻辑包…

C++奇迹之旅:探索C++拷贝构造函数

文章目录 &#x1f4dd;拷贝构造函数&#x1f320; 概念&#x1f309;特征 &#x1f320;浅拷贝(值拷贝)&#x1f309;深拷贝 &#x1f320;拷贝构造函数典型调用场景&#x1f320;应用时效率的思考&#x1f6a9;总结 &#x1f4dd;拷贝构造函数 &#x1f320; 概念 在现实生…

京西商城——前端项目的创建以及前后端联调

创建VUE项目 在jingxi_shop_project文件夹中再创建一个 frontend 文件夹用来存放前端项目 /jingxi_shop_project/backend/jingxi_shop_project....../frontend/jingxi_shop_web......首先要安装 node.js 和 VUE cli&#xff0c;进入到项目目录内创建项目 vue create jingxi_…

前端css中transition的使用

前端css中transition的使用 一、前言二、transition的4个属性三、例子1.源码12.源码1运行效果 四、结语五、定位日期 一、前言 CSS中的transition&#xff08;过渡&#xff09;&#xff0c;根据字面意思就可以理解成一种变化状态的过程。当我们有一个方形&#xff0c;我们想让…

Ubuntu 22最新dockers部署redis哨兵模式,并整合spring boot的详细记录(含spring boot项目包)

dockers部署redis哨兵模式&#xff0c;并整合spring boot 环境说明相关学习博客一、在docker中安装redis1、下载dockers镜像包和redis配置文件&#xff08;主从一样&#xff09;2、编辑配置文件&#xff08;主从一样&#xff09;3、启动redis&#xff08;主从一样&#xff09;4…

Flutter MQTT通信(实现聊天功能)

MQTT协议简介&#xff1a; MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级的、开放的、基于发布/订阅模式的消息传输协议&#xff0c;最初由IBM开发。它专门设计用于在低带宽、不稳定的网络环境下进行高效的消息传输。 学习完本篇文章&#x…

重启服务器或重启docker,导致emqx的Dashboard的密码重置为public

最近在项目中突然发现重启服务器,或者重启docker 修改好的emqx的Dashboard的密码重置为public 技术博客 http://idea.coderyj.com/ 1.解决办法就是固定 emqx的节点 # 拉取镜像 docker pull emqx/emqx# 创建目录&#xff0c;进行目录挂载 mkdir -p /docker/emqx/{etc,lib,data,…

llama-factory SFT系列教程 (三),chatglm3-6B 大模型命名实体识别实战

文章列表&#xff1a; llama-factory SFT系列教程 (一)&#xff0c;大模型 API 部署与使用llama-factory SFT系列教程 (二)&#xff0c;大模型在自定义数据集 lora 训练与部署 llama-factory SFT系列教程 (三)&#xff0c;chatglm3-6B 命名实体识别实战 简介 利用 llama-fa…

OpenHarmony轻量系统开发【12】OneNET云接入

12.1 OneNET云介绍 通常来说&#xff0c;一个物联网产品应当包括设备、云平台、手机APP。我将在鸿蒙系统上移植MQTT协议、OneNET接入协议&#xff0c;实现手机APP、网页两者都可以远程&#xff08;跨网络&#xff0c;不是局域网的&#xff09;访问开发板数据&#xff0c;并控制…

如何在阿里云主机上安装FreeBSD14系统

文章目录 在阿里云主机上安装FreeBSD14系统准备阿里云云主机识别目标磁盘下载 FreeBSD14解压缩 FreeBSD14系统镜像创建可启动的磁盘启动 FreeBSD14在阿里云主机上安装FreeBSD14系统 阿里云主机不支持 FreeBSD14 系统的镜像,因此需要手动进行安装。 准备阿里云云主机 在阿里云…

项目_预览和模拟器运行_真机运行鸿蒙应用---HarmonyOS4.0+鸿蒙NEXT工作笔记002

然后再来看如何使用预览,可以看到 右侧有个preview,点开就可以了 然后再有一个tools,这里 Device Manager,这个是模拟器 点开以后可以看到让我们连接,本地模拟器,还是远程模拟器,还是远程设备 这里我们选择phone 如果选择remote device,这个需要登录华为账号,会自动弹出来登…

探索SQL深入理解数据库操作的关键概念与技巧【文末送书】

文章目录 SQL语言从入门到精通入门篇进阶篇高级篇深入理解SQL SQL语言从入门到精通&#xff08;软件开发视频大讲堂&#xff09;【文末送书】 SQL语言从入门到精通 SQL&#xff08;Structured Query Language&#xff0c;结构化查询语言&#xff09;是一种用于管理关系型数据库…

李飞飞团队发布《2024年人工智能指数报告》,预测人工智能未来发展趋势

昨天&#xff0c;斯坦福大学 Human-Center Artificial Intelligence (HAI)研究中心发布了《2024年人工智能指数报告》。 由斯坦福大学发起的人工智能指数&#xff08;AI Index&#xff09;是一个追踪 AI 动态和进展的非营利性项目&#xff0c;旨在全面研究 AI 行业状况&#xf…

云服务器租用一年、1个月优惠价格表,阿里/腾讯/京东/华为云

现在租一个服务器多少一个月&#xff1f;优惠价格低至3.8元1个月&#xff0c;租用一个月云服务器收费价格表&#xff1a;阿里云和腾讯云2核2G3M服务器优惠价格61元一年&#xff0c;折合一个月5元&#xff0c;京东云轻量云主机5.8元一个月&#xff0c;华为云服务器优惠价格3.8元…