常见六种排序算法(java版本)
Java资料站
共 14340字,需浏览 29分钟
· 2021-05-14
点击上方蓝色字体,选择“标星公众号”
优质文章,第一时间送达
什么是排序算法的稳定性?
冒泡排序算法
最好 | 平均 | 最坏 | 辅助存储 | 稳定 |
---|---|---|---|---|
O(n) | O(n²) | O(n²) | O(1) | Y |
public static int [] maopao1(int array[]){
int t;
for(int i = 0;i <array.length;i ++){
for(int j = 0;j < array.length-i-1;j ++){
if(array[j] < array[j+1]){
t = array[j+1];
array[j+1] = array[j];
array[j] = t;
}
}
}
return array;
}
选择排序算法
最好 | 平均 | 最坏 | 辅助存储 | 稳定 |
---|---|---|---|---|
O(n²) | O(n²) | O(n²) | O(1) | N |
//选择
public static int [] selectSort(int[] array){
int t = 0;
int max = 0;
for(int i = 0; i < array.length;i ++){
max = i;
for(int j = i;j < array.length;j ++){
if(array[j] > array[max]){
max = j;
}
}
//如果i就是max,不用交换位置
if(i != max){
t = array[max];
array[max] = array[i];
array[i] = t;
}
}
return array;
}
快速排序算法
最好 | 平均 | 最坏 | 辅助存储 | 稳定 |
---|---|---|---|---|
O(nlog(n)) | O(nlog(n)) | O(n²) | O(log(2)(n)) | N |
//快速排序:分而治之的思想,一左一右两个指针,以left为基准
public static void quickSort(int left,int right,int [] arr){
//从小到大排序
int i = left;
int j = right;
//注意:i也不能等于j,当i==j说明排序完成,最后一次的左/右部分只有一个数字
if(i >= j)
return ;
//定义一个基准值
int k = arr[left];
while(i != j){
//i不能大于j
if(arr[i] <= k && i < j){
i++;
}
if(arr[j] > k && i < j){
j --;
}
if(i < j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
//i == j
if(k > arr[i]){
int temp = arr[left];
arr[left] = arr[i];
arr[i] = temp;
}
//递归
quickSort(left,i-1,arr);
quickSort(i,right,arr);
}
归并排序算法
最好 | 平均 | 最坏 | 辅助存储 | 稳定 |
---|---|---|---|---|
O(nlog(n)) | O(nlog(n)) | O(nlog(n)) | O(n) | Y |
//归并排序:先分割,再合并
//分割
public static int [] separate(int [] arr){
if(arr.length < 2){
return arr;
}
//找中位数,Math.floor(a)得到小于a的最大整数
//可能数组数量为奇数的情况下
int mid = (int)Math.floor(arr.length/2);
//分成两个
int [] left = Arrays.copyOfRange(arr,0,mid);//(左闭右开]
int [] right = Arrays.copyOfRange(arr,mid,arr.length);//因为下标从0开始,所以本来就取不到arr.length,不用减一
//递归
return merge(separate(left),separate(right));
}
//合并
public static int [] merge(int [] left,int [] right){
int [] arr = new int[left.length+right.length];
if(arr.length < 2){
//判断如果数组长度小于2,那么必定其中一个数组有值,一个无值,返回有值的即可
return left.length == 0?right:left;
}
int i=0,j=0,k=0;
while(i<left.length && j<right.length){
//把小的那个数组添加到新数组中
if(left[i] < right[j]){
arr[k++] = left[i++];
}else{
arr[k++] = right[j++];
}
}
//最后还有一个没有添加到arr新数组中,这时加上去
while(i < left.length){
arr[k++] = left[i++];
}while(j < left.length){
arr[k++] = right[j++];
}
return arr;
}
直接插入排序算法
最好 | 平均 | 最坏 | 辅助存储 | 稳定 |
---|---|---|---|---|
O(n) | O(n²) | O(n²) | O(1) | Y |
public static void insertSortAsc(int [] arr){
for(int i=1;i<arr.length;i++){
int temp=arr[i];//temp哨兵位置
int index=i-1;//index代表与哨兵比较的值的下标
//index不能小于0&&升序,把index指向的数值与哨兵作比较,如果哨兵小于index指向的元素
while(index >=0 && arr[index] > temp){
//把index指向的元素后移一位
arr[index+1] = arr[index];
index --;//index--确保从已经排好的元素中选择,从后往前扫描
}
//这时,在拍排的序列中,比哨兵大的元素都已在哨兵右边,此时把哨兵放到index+1位置上即可
arr[index+1] = temp;
}
}
希尔排序算法
最好 | 平均 | 最坏 | 辅助存储 | 稳定 |
---|---|---|---|---|
O(n) | O(n^(3/2)) | O(n^(3/2)) | O(1) | N |
public static void shellSortAsc(int[] arr){
int gap=arr.length/2;//增量,初始为数组长度一半
while(gap>=1){
for(int i=gap;i<arr.length;i++){//这里其实就是插入排序,不过把原来的i=1变成i=gap
int temp=arr[i];
int index=i-gap;
while(index>=0&&arr[index]>temp){
arr[index+gap]=arr[index];
index=index-gap;
}
arr[index+gap]=temp;
}
gap=gap/2;//增量递减
}
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:
https://blog.csdn.net/suo_jia_hao/article/details/116565973
锋哥最新SpringCloud分布式电商秒杀课程发布
👇👇👇
👆长按上方微信二维码 2 秒
感谢点赞支持下哈
评论
大量 Java 开源项目停更...
点击关注公众号,Java 干货及时推送↓推荐阅读:投了 100 多份简历后…出品 | OSC开源社区(ID:oschina2013)Sonatype 发布了最新的一份《软件供应链状况》报告,深入探讨了如何在充满选择的世界中定义更好的软件,并探讨人工智能 (AI) 对软件开发的深远
Java技术栈
0
Java 神作,必读!
Java 程序员们开年就有重磅好消息,《Effective Java 中文版(原书第 3 版)》要上市啦!该书的第1版出版于 2001 年,当时就在业界流传开来,受到广泛赞誉。时至今日,已热销近20年,本书第 3 版已是 Java 程序员的必读神书,被誉为“Java 四大名著之一”,甚至连 Java
小哈学Java
0
Java与lua互相调用简单教程
来源:网络👉 欢迎加入小哈的星球 ,你将获得: 专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书福利全栈前后端分离博客项目 2.0 版本完结啦, 演示链接:http://116.62.199.48/ ,新项目
小哈学Java
0
【送书福利】《Java面试八股文:高频面试题与求职攻略一本通》
先来唠唠最近粉丝面试回来跟我聊天,基本上都提到一个点,在面试过程中八股文占比很高(八股文70%、项目20%、10%算法)除了一些搞算法突出的厂除外。其实现在很多厂八股都是逐渐深入的方式来问,所以大家在学习的过程中,针对一些重点的内容,最好深入去学习,不然还是比较难应对这种追问式的问题。最近刚好从一位
Java后端技术
0
IntelliJ IDEA 2024 首个大版本发布,好用到爆!
关注我们,设为星标,每天7:40不见不散,架构路上与您共享回复架构师获取资源大家好,我是你们的朋友架构君,一个会写代码吟诗的架构师。JetBrains 为多款 IDE 发布了 2024 年度首个大版本更新 (2024.1),包括 IntelliJ IDEA 、WebSt
Java架构师社区
0
面试官:限流的常见算法有哪些?
限流的实现算法有很多,但常见的限流算法有三种:计数器算法、漏桶算法和令牌桶算法。1.计数器算法计数器算法是在一定的时间间隔里,记录请求次数,当请求次数超过该时间限制时,就把计数器清零,然后重新计算。当请求次数超过间隔内的最大次数时,拒绝访问。计数器算法的实现比较简单,但存在“突刺现象”。突刺现象是指
Stephen
0
Java项目实战——打造一款股票区间交易盯盘系统
点击上方“Java进阶学习交流”,进行关注后台回复“Java”即可获赠Java学习资料今日鸡汤身无彩凤双飞翼,心有灵犀一点通。一、简介大家好,我是Snowball。今天给大家分享的内容是基于Java编程,实现股票交易相关功能开发,如果读者对股票或金融衍生物交易不太了解,又比较感兴趣的话可自行查询相关
Java进阶学习交流
0
985 本硕,秋招上岸阿里算法岗!
↓推荐关注↓节前,我们星球举办了技术&面试交流会,邀请了一些互联网大厂好友以及今年参加社招和校招面试的同学。会上探讨了一系列热门话题,包括大模型发展趋势、算法落地实践、面经总结,以及如何做好面试准备和应对常见考点。基于经验交流与实战经验,我们总结如下:《机器学习算法面试宝典》1.0 发布!今
Python学习与数据挖掘
0