排序个人总结

插入排序

思路;定义 和 j,默认 i 前面的数都是有序的,j 定义为 i 的前一个数,把 i 的值给tmp,tmp与j对应的值进行比较,如果arr[j] > tmp,将arr[j] (大的数前移一位),如下图

代码:

    //插入排序//每次循环i前面的值都是有序的public void insertSort(int[] arr){for (int i = 1; i < arr.length; i++) {int j = i-1;        //j定义为i的前一个数int tmp = arr[i];   //将arr[i]设置为临时变量,插入i前面有序的数组中for(;j>=0;j--){if(arr[j]>tmp){arr[j+1]=arr[j];        //前移}else {//代表前面已经有序了//arr[j+1]=tmp;       //将tmp放回到原来的位置break;}}arr[j+1]=tmp;       //跳出循环的时候,j已经小于0了,}}

特点:时间复杂度

最好情况下:数据都是有序的情况下:O(N)

最坏情况下:数据完全逆序的O(n^2)

空间复杂度 O(1)

稳定性:稳定的

希尔排序

思路:数组分组进行排序,如下

10个数,分5组,组内进行排序,组内使用插入排序,

再分两组,组内进行排序,

最后分一组,排序完成

代码如下

//希尔排序public void shellSort(int[] arr){int gap = arr.length;   //gap分的组,while (gap>1){gap = gap/3 +1 ;shell( arr , gap);      //将分好的组进行插入排序}}private void shell(int[] arr, int gap){     //这里和插入排序思路一样,只是插入排序中,            //我们按照1来进行计算,这里按照gap来进行计算//建议:先把插入排序写完,再写希尔排序for(int i = gap;i<arr.length;i++){int j = i-gap;int tmp = arr[i];for(;j>=0;j-=gap){if(arr[j]>tmp){arr[j+gap]=arr[j];              //大的数后移}else {break;}}arr[j+gap]=tmp;}}

特点:不稳定排序,时间复杂度不好计算

选择排序

思路;定义一个i下标,和 j= i + 1,将i下标定义为minIndex,j向后遍历,寻找i后面比minIndex还要小的值,找到了就重新定义minIndex,循环结束后和i的位置进行交换

代码如下:

    //选择排序public void selectSort(int[] arr){for(int i = 0;i<arr.length;i++){int j = i+1;                //j在i的前一个数,j向后寻找比i下标值小的数,找到了就和    //i下标的值交换,找不到就向后移动int minIndex = i;for(;j<arr.length;j++){if(arr[j]<arr[minIndex]){minIndex=j;         //跟新最小值下标}}//循环结束后,找到了i前面的最小值小标//将i的位置和最小值下标交换Swap(arr,i,minIndex);}}private static void Swap(int[] arr,int a,int b){int tmp = arr[a];arr[a]=arr[b];arr[b]=tmp;}

特点:时间复杂度O(N^2)

空间复杂度O(1)

稳定性:不稳定

堆排序

堆排序需要将数组变成大根堆。

因为是大根堆,所以头节点是最大的,将头节点和尾节点进行交换,让后向下调整,每次调整后都将最大的节点放到尾部,调整完后就是从小到大的排序

代码如下

//堆排序//堆排序首先需要创建大根堆,public void headSort(int[] arr){//先将数组变成大根堆createBigHead(arr);int end = arr.length -1;while (end > 0){Swap(arr,0,end);            //交换头和最后一位节点进行向下调整shiftDown(arr,0,end);end--;}}
//创建大根堆/采用向下调整的方法public void createBigHead(int [] arr){int end = arr.length;int parent = (arr.length-1-1)/2;         //最后一颗子树的父亲节点,开始向下调整for(;parent>=0;parent--){shiftDown(arr,parent,end);}}private static void shiftDown(int[] arr,int parent,int end){int child = 2*parent +1 ;               //左孩子节点while (child<end){//找出孩子节点中最大的一个,和父亲节点进行交换if(child+1<end&&arr[child]<arr[child+1]){child=child+1;}if(arr[child]>arr[parent]){Swap(arr,child,parent);//交换完成后父亲和孩子节点向下调整parent=child;child = 2*parent+1;}else {break;}}}

快速排序

思路:

代码如下

public void quickSort(int [] arr){int start = 0;              //设置开始和结束int end = arr.length-1;     quick(arr,start,end);       //调用方法}public void quick(int[] arr,int start,int end){if(start>=end){         //当开始大于结束时,递归结束return;}int pivot = partition(arr,start,end);       quick(arr,start,pivot-1);quick(arr,pivot+1,end);}public int partition(int[] arr, int left ,int right){int tmp = arr[left];            //设置第一个值为基准int i = left;                   //保留第一个值的位置while (left<right){while (left<right&&arr[right]>=tmp){right--;                            //从右边开始找,找到比tmp小的值让后停下来}            while (left<right&&arr[left]<=tmp){     //第一个判定条件是防止整个数组的值都比tmp小,从而导致数组越界left++;                             //从左边开始找,找到比tmp大的值让后停下来}Swap(arr,left,right);                   //交换,两个值,有可能left和right相等,相等就交换自己}Swap(arr,i,left);                       //把相遇的点和第一位交换return left;                            //返回left和right相遇的点}

上述是快速排序的一种方法,下面是第二种方法,挖坑法

public int partition2(int [] arr,int left,int right){int tmp = arr[left];int i = left;while (left<right){while (left<right&&arr[right]>=tmp){right--;}arr[left]=arr[right];           //右边找到比tmp小的,直接交换while (left<right&&arr[left]<=tmp){left++;}arr[right]=arr[left];       //左边找到比tmp大的,直接交换}arr[left]=tmp;          //将取出的tmp放回到空格处return left;}

这里有个疑问,为啥

while (left<right&&arr[left]<=tmp){left++;
}
arr[right]=arr[left];       //左边找到比tmp大的,直接交换
while (left<right&&arr[right]>=tmp){right--;
}
arr[left]=arr[right];           //右边找到比tmp小的,直接交换

这两个循环换一下执行顺序就出错了,不理解我就死记了

特点:时间复杂度n*logn,是不稳定的排序

归并排序

思路:将数组分裂,分裂结束后再进行组内合并

合并的时候需要创建一个新的数组用来存放排序好的数组

//归并排序public void mergeSort(int[] arr){mergeFunc(arr,0,arr.length-1);}public void mergeFunc(int[] arr,int left,int right){if(left>=right){return;}//进行分裂int mid = (left+right)/2;mergeFunc(arr,left,mid);        //分裂左边mergeFunc(arr,mid+1,right);     //分裂右边//分裂完后进行合并merge( arr, left,mid,right);}public void merge(int[] arr,int left,int mid,int right){int s1 = left;int e1 = mid;int s2 = mid+1;int e2 = right;int[] tmp = new int[(right-left)+1];int k = 0;while (s1<=e1&&s2<=e2){  //代表分裂的这段有数据//s1和s2进行比较if(arr[s1]<=arr[s2]){tmp[k++]=arr[s1++];      //谁小放谁进去}else {tmp[k++]=arr[s2++];}}while (s1<=e1){              //如果有一个没有数据了,直接把剩下的全放进去tmp[k++]=arr[s1++];}while (s2<=e2){tmp[k++]=arr[s2++];}//再把数据拷贝回原来的数组中for (int i = 0; i < k; i++) {arr[i+left]=tmp[i];        //拷贝回原来的数组}}

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

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

相关文章

String类常用的方法

源代码&#xff1a; 输出结果&#xff1a;

从HarmonyOS Next导出手机照片

1&#xff09;打开DevEco Studio开发工具 2&#xff09;插入USB数据线&#xff0c;连接手机 3&#xff09;在DevEco Studio开发工具&#xff0c;通过View -> Tool Windows -> Device File Browser打开管理工具 4&#xff09;选择storage -> cloud -> 100->fi…

MySQL InnoDB MVCC读写逻辑分析与调测

目标 1、构建MVCC读写场景 2、gdb调试MVCC过程&#xff0c;输出流程图&#xff08;函数级别调用过程&#xff09; 前提 准备1 打开服务端 查询mysqld进程号 线程树 打开客户端&#xff0c;想创建几个事务号就打开几个客户端 准备2 数据库mvcc&#xff0c;两个表test和stu…

韩媒专访CertiK首席商务官:持续关注韩国市场,致力于解决Web3安全及合规问题

作为Web3.0头部安全公司&#xff0c;CertiK在KBW期间联合CertiK Ventures举办的活动引起了业界的广泛关注。CertiK一直以来与韩国地方政府保持着紧密合作关系&#xff0c;在合规领域提供强有力的支持。而近期重磅升级的CertiK Ventures可以更好地支持韩国本地的区块链项目。上述…

Nmap网络扫描器基础功能介绍

怎么快速知道网络中存在哪些设备呢&#xff1f;我们可以借用扫描工具Nmap来实现这个功能。 下载 Windows系统可以前往Nmap官网下载安装包。 Linux使用对应的包管理器可以直接安装&#xff0c;命令如下 # Debian/Ubuntu apt install nmap# RedHat/Fedora yum install nmap …

数据在内存中的存储(下)

目录 前言一、浮点数在内存中的存储1.1 练习1.2 浮点数的存储1.2.1 浮点数存的过程1.2.2 浮点数取的过程 1.3 题目解析 总结 前言 前面一期我们主要说到整形在数据中的存储方式&#xff0c;这期我们来看看浮点数在内存中是如何存储的&#xff0c;话不多说&#xff0c;正文开始…

运行python程序

1 终端运行 1.1、直接在python解释器中书写代码 >>> print(法外狂徒) 法外狂徒 …

【数据结构初阶】排序算法(上)插入排序与选择排序

文章目录 1.排序概念及运用1. 1 概念1. 2 运用1.3 常见排序算法 2. 插入排序2. 1 直接插入排序2. 2 希尔排序2. 2. 1 希尔排序的时间复杂度 3. 选择排序3. 1 直接选择排序3. 2 堆排序3. 3 Top-K问题 1.排序概念及运用 1. 1 概念 排序&#xff1a;所谓排序&#xff0c;就是使一…

PySimpleGUI:简化 Python 中的 GUI 开发

作为一个算法工程师&#xff0c;避免不了需要标注数据&#xff08;当然还有其他需求&#xff09;&#xff0c;标注数据时还是需要一个很好的工具&#xff0c;此时需要你来写一个图形用户界面&#xff08;GUI&#xff09;&#xff0c;太难了&#xff5e; 然而&#xff0c;PySim…

Java语言程序设计基础篇_编程练习题**18.34 (游戏:八皇后问题)

目录 题目&#xff1a;**18.34 (游戏:八皇后问题) 代码示例 代码解析 输出结果 使用文件 题目&#xff1a;**18.34 (游戏:八皇后问题) 八皇后问题是要找到一个解决方案&#xff0c;将一个皇后棋子放到棋盘上的每行中&#xff0c;并且两个皇后棋子之间不能相互攻击。编写个…

B-树(不是B减树)原理剖析(1)

目录 B树的主要特性&#xff1a; B树的操作&#xff1a; B树的优点&#xff1a; 为什么要发明出B-树&#xff1f; B树的概念和原理剖析 原理图讲解(部分讲解在图中) 初始化结点&#xff1a; 处理数据数量计算(了解) 底层代码实现(加深理解) 前些日子我们学了AVl树&…

MySQL InnoDB undo log生成逻辑分析

引用《InnoDB存储引擎》中有一句话&#xff0c;特别重要&#xff1a; 用户通常对undo有这样的误解&#xff1a;undo用于将数据库物理地恢复到执行语句或事务之前的样子---但事实并非如此。 undo是逻辑日志&#xff0c;因此只是将数据库逻辑地恢复到原来的样子。所有的修改都被…

通信工程学习:什么是NFV网络功能虚拟化

NFV&#xff1a;网络功能虚拟化 NFV&#xff08;Network Function Virtualization&#xff09;&#xff0c;即网络功能虚拟化&#xff0c;是一种通过虚拟化技术实现网络功能的技术手段。它借鉴了x86服务器的架构&#xff0c;将传统的网络硬件设备如路由器、交换机、防火墙、负载…

neo4j:ubuntu环境下的安装与使用

一、neo4j安装 1. 下载安装包 进入网站&#xff1a;https://neo4j.com/deployment-center/#community 在上图中选择下载即可&#xff08;社区版免费&#xff09; 注意&#xff1a;neo4j的版本要和电脑安装的jdk版本对应&#xff0c;jdk版本使用java --version查看&#xff1a;…

华为认证HCIA篇--网络通信基础

大家好呀&#xff01;我是reload。今天来带大家学习一下华为认证ia篇的网络通信基础部分&#xff0c;偏重一些基础的认识和概念性的东西。如果对网络通信熟悉的小伙伴可以选择跳过&#xff0c;如果是新手或小白的话建议还是看一看&#xff0c;先有个印象&#xff0c;好为后续的…

复制他人 CSDN 文章到自己的博客

文章目录 0.前言步骤 0.前言 在复制别人文章发布时&#xff0c;记得表明转载哦 步骤 在需要复制的csdn 文章页面&#xff0c;打开浏览器开发者工具&#xff08;F12&#xff09;Ctrl F 查找"article_content"标签头 右键“Copy”->“Copy element”新建一个 tx…

【Godot4自学手册】第四十八节创建雨粒子效果

今天我们要利用GPU粒子节点玩雨粒子效果&#xff0c;下雨天。 一、添加GPU粒子系统 添加GPUParticles2D节点。选择根节点&#xff0c;单击添加按钮&#xff0c;选择GPUParticles2D&#xff0c;完成添加。 二、修改属性 1.设置粒子数量。 在GPUParticles2D检查器中将Amount设…

速记篇 |TCP/IP五层模型怎么背,OSI七层模型怎么背?

背景 记忆TCP/IP五层模型和OSI七层模型可以通过理解每一层的功能、作用以及它们之间的逻辑关系来进行。下面分别给出这两个模型的记忆方法和要点&#xff1a; TCP/IP五层模型 TCP/IP五层模型是一个简化的模型&#xff0c;从下到上依次为&#xff1a; 1.物理层&#xff08;Physi…

计算机毕业设计之:云中e百货微信小程序设计与实现(源码+文档+定制)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

微信小程序转化为uni-app项目

前言&#xff1a; 之前自己做一个uni-app的项目的时候前端需要实现一个比较复杂的动态tab和swiper切换的功能&#xff0c;但是由于自己前端抠脚的原因没有写出来&#xff0c;然后自己在网上搜索的时候发现了有个微信小程序里面的页面及极其的符合我的需求。那么问题来了我该如何…