四大常见的排序算法JAVA

news/2024/10/9 11:20:33/

1. 冒泡排序

  1. 相邻的元素两两比较,大的放右边,小的放左边

  2. 第一轮比较完毕之后,最大值就已经确定,第二轮可以少循环一次,后面以此类推

  3. 如果数组中有n个数据,总共我们只要执行n-1轮的代码就可以

 

 

package Bubble;/*冒泡排序:核心思想:1,相邻的元素两两比较,大的放右边,小的放左边。2,第一轮比较完毕之后,最大值就已经确定,第二轮可以少循环一次,后面以此类推。3,如果数组中有n个数据,总共我们只要执行n-1轮的代码就可以。*/
public class demo1 {public static void main(String[] args) {//1.定义数组int[] arr = {2, 4, 5, 3, 1};//2.利用冒泡排序将数组中的数据变成 1 2 3 4 5int[] newArr = bubble_sort(arr);for (int i = 0; i < newArr.length; i++) {System.out.print(newArr[i] + " ");}}private static int[] bubble_sort(int[] arr) {//外循环: 表示我要执行多少论,如果有n个数据,那么执行n-1论for (int i = 0; i < arr.length - 1; i++) {for (int j = 0; j < arr.length - 1 - i; j++) {//内循环:每一轮中我如何比较数据并且找到当前的最大值//-1:为了防止索引越界//-i:提高效率,每一轮执行的次数应该比上一轮少一次if (arr[j] > arr[j + 1]) {int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}return arr;}
}

 

2.选择排序

  1. 从0索引开始,跟后面的元素一一比较

  2. 小的放前面,大的放后面

  3. 第一次循环结束后,最小的数据已经确定

  4. 第二次循环从1索引开始以此类推

  5. 第三轮循环从2索引开始以此类推

  6. 第四轮循环从3索引开始以此类推。

 

 

 

        

package Bubble;
//选择排序
public class demo2 {public static void main(String[] args) {int[] arr = {4, 32, 1, 5, 6};//外循环:几轮//i表示这一轮当中,我拿着哪个的索引上的数据跟后面的数据进行交换for (int i = 0; i < arr.length - 1; i++) {for (int j = i + 1; j < arr.length; j++) {//内循环:每一轮拿着i跟i后面的数据进行比较交换if (arr[i] > arr[j]) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}}for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}}
}

3.插入排序

插入排序的代码实现虽然没有冒泡排序和选择排序那么简单粗暴,但它的原理应该是最容易理解的了,因为只要打过扑克牌的人都应该能够秒懂。插入排序是一种最简单直观的算法>排序算法,它的工作原理是通过创建有序序列和无序序列,然后再遍历无序序列得到里面每一个数字,把每一个数字插入到有序序列中正确的位置。

插入排序在插入的时候,有优化算法,在遍历有序序列找正确位置时,可以采取二分查找

将0索引的元素到N索引的元素看做是有序的,把N+1索引的元素到最后一个当成是无序的。

遍历无序的数据,将遍历到的元素插入有序序列中适当的位置,如遇到相同数据,插在后面。

N的范围:0~最大索引

package Bubble;/*插入排序:将0索引的元素到N索引的元素看做是有序的,把N+1索引的元素到最后一个当成是无序的。遍历无序的数据,将遍历到的元素插入有序序列中适当的位置,如遇到相同数据,插在后面。N的范围:0~最大索引*/
public class demo3 {public static void main(String[] args) {int[] arr = {3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48};//1.找到无序的哪一组数组是从哪个索引开始的。  2int startIndex = -1;for (int i = 0; i < arr.length; i++) {if (arr[i] > arr[i + 1]) {startIndex = i + 1;break;}}//2.遍历从startIndex开始到最后一个元素,依次得到无序的哪一组数据中的每一个元素for (int i = startIndex; i < arr.length; i++) {//记录当前要插入数据的索引int j = i;while (j > 0 && arr[j] < arr[j - 1]) {//j>0: 和前一个元素比较索引必须大于0//交换int tmp = arr[j];arr[j] = arr[j - 1];arr[j - 1] = tmp;j--;}}for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}}
}

 

递归算法

package dg;public class demo1 {public static void main(String[] args) {//利用递归球1-100之间的和int sum = getSum(100);System.out.println(sum);}//大问题拆解小问题//1~100之间的和=100+(1~99之间的和)//1~99之间的和=99+(1~98之间的和)//1~98之间的和=98+(1~97之间的和)//....//1~2之间的和=2+(1~1之间的和)//1~1之间的和就是1public static int getSum(int num){if(num==1)return 1;else{return num+getSum(num-1);}}}

package dg;public class demo2 {public static void main(String[] args) {//递归求5的阶乘int factorial = getFactorial(5);System.out.println(factorial);}public static int getFactorial(int n) {//5!=5*4*3*2*1//5!=5*4!//4!=4*3!//3!=3*2!//2!=2*1!//1!=1if (n == 1) {return 1;} else {return n * getFactorial(n - 1);}}
}

4. 快速排序

  1. 从数列中挑出一个元素,一般都是左边第一个数字,称为 "基准数";

  2. 创建两个指针,一个从前往后走,一个从后往前走。

  3. 先执行后面的指针,找出第一个比基准数小的数字

  4. 再执行前面的指针,找出第一个比基准数大的数字

  5. 交换两个指针指向的数字

  6. 直到两个指针相遇

  7. 将基准数跟指针指向位置的数字交换位置,称之为:基准数归位。

  8. 第一轮结束之后,基准数左边的数字都是比基准数小的,基准数右边的数字都是比基准数大的。

  9. 把基准数左边看做一个序列,把基准数右边看做一个序列,按照刚刚的规则递归排序

① 

首先把0索引当做基准数,如图6为基准数,确定左下标start,右下标end,start下标是找比基准数大的数,

end是找比基准数小的数 ,先找end,找到了1停下,然后找start的数,找到停下并且交换,一直start++,end--,直到start和end指向同一根数   ,如下图

那么指向同一个数的下标就是基准数要存入的位置,也就是基准数要放入的地方

专业名称:基准数归位,基准数左边的都比基准数小,右边的都比基准数大

 

找到第一个基准数以后,然后利用这个基准数分为二边,然后左边利用第一个索引3为基准数在左边进行排序,在利用9在右边排序

package Bubble;/*快速排序:第一轮:以0索引的数字为基准数,确定基准数在数组中正确的位置。比基准数小的全部在左边,比基准数大的全部在右边。后面以此类推。*/
public class demo4 {public static void main(String[] args) {int[] arr = {6, 2, 7, 9, 3, 4, 5, 1, 10, 8};qsort(arr, 0, arr.length - 1);for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}}/**   参数一:我们要排序的数组*   参数二:要排序数组的起始索引*   参数三:要排序数组的结束索引* */public static void qsort(int[] arr, int i, int j) {//定义两个变量记录要查找的范围int start = i;int end = j;if(start > end){//递归的出口return;}//定义基准数int baseNumber = arr[i];while (start != end) {//利用end,从后往前走,找到基准数小的就停下while (true) {if (end <= start || arr[end] < baseNumber) {break;}end--;}//利用start,前往后走,找到基准数大的就停下while (true) {if (end <= start || arr[start] > baseNumber) {break;}start++;}//交换end和start所指向的数int tmp = arr[start];arr[start] = arr[end];arr[end] = tmp;}//当start和end指向了同一个元素的时候,那么上面的循环就会结束//表示已经找到了基准数在数组中应存入的位置//基准数归位//就是拿着这个范围中的第一个数字,跟start指向的元素进行交换int tmp = arr[i];arr[i] = arr[start];arr[start] = tmp;//确定6左边的范围,重复刚刚所做的事情qsort(arr, i, start - 1);//确定6右边的范围,重复刚刚所做的事情qsort(arr,start + 1,j);}
}

总结


http://www.ppmy.cn/news/1474391.html

相关文章

jmeter-beanshell学习3-beanshell获取请求报文和响应报文

前后两个报文&#xff0c;后面报文要用前面报文的响应结果&#xff0c;这个简单&#xff0c;正则表达式或者json提取器&#xff0c;都能实现。但是如果后面报文要用前面请求报文的内容&#xff0c;感觉有点难。最早时候把随机数写在自定义变量&#xff0c;前后两个接口都用这个…

【ChatGPT】全面解析 ChatGPT:从起源到未来

ChatGPT 是由 OpenAI 开发的一个基于 GPT&#xff08;Generative Pre-training Transformer&#xff09;架构的聊天机器人。通过自然语言处理&#xff08;NLP&#xff09;技术&#xff0c;ChatGPT 能够理解和生成语言&#xff0c;与人类进行对话。本文将深入探讨其起源、发展、…

CentOS6禁止锁屏

在电源中设置后还是会锁屏, 原因是有屏幕保护程序 电源管理都 “从不” 一些AI的回答 在CentOS 6系统中&#xff0c;如果你想要禁用锁屏功能&#xff0c;可以编辑/etc/kbd/config文件。这个文件通常包含了键盘相关的设置&#xff0c;包括密码策略和屏幕锁定选项。 首先打开终…

秋招突击——7/9——字节面经

文章目录 引言正文八股MySQL熟悉吗&#xff1f;讲一下MySQL索引的结构&#xff1f;追问&#xff1a;MySQL为什么要使用B树&#xff1f;在使用MySQL的时候&#xff0c;如何避免索引失效&#xff1f;讲一下MySQL的事物有哪几种特征&#xff1f;MySQL的原子性可以实现什么效果&…

Python从Excel表中查找指定数据填入新表

#读取xls文件中的数据 import xlrd file "原表.xls" wb xlrd.open_workbook(file) #读取工作簿 ws wb.sheets()[0] #选第一个工作表 data [] for row in range(7, ws.nrows): name ws.cell(row, 1).value.strip() #科室名称 total1 ws.cell(row, 2…

cloudflare tunnels tcp

这里是官网的说明Cloudflare Tunnel Cloudflare Zero Trust docs 根据实际情况安装环境 tunnels除了http,https协议是直接暴露公网&#xff0c;tcp是类似ssh端口转发。 在需要内网穿透的局域网找一条机子部署代理 我这边是window cloudflared tunnel login #生成一个身份校…

智能微服务调度:Eureka中的区域感知性配置指南

智能微服务调度&#xff1a;Eureka中的区域感知性配置指南 引言 在构建全球分布式系统时&#xff0c;服务的可用性区域感知性是确保用户体验和系统弹性的关键因素。Eureka&#xff0c;作为Netflix开源的服务发现框架&#xff0c;提供了区域感知性配置&#xff0c;允许服务消费…

Golang | Leetcode Golang题解之第226题翻转二叉树

题目&#xff1a; 题解&#xff1a; func invertTree(root *TreeNode) *TreeNode {if root nil {return nil}left : invertTree(root.Left)right : invertTree(root.Right)root.Left rightroot.Right leftreturn root }