-
@author 王恒杰
-
@version 1.0
-
@date 2021/9/22 8:34
-
@email 1078993387@qq.com
-
@Address 天津
-
@Description:
*/
public class Bubble {
/**
-
对数组内的元素进行排序
-
@param a
*/
public static void sort(Comparable[] a){
// 第一个for循环控制轮数,比较次数
// 第一轮比较的数是a.length-1
for (int i = a.length-1; i >0; i–) {
// 是数组相邻的两个数进行比较
for (int j = 0; j <i ; j++) {
int result= a[j].compareTo(a[j + 1]);
if(result>0){
each(a,j,j+1);
}
}
}
}
/**
-
判断两个数据大小
-
@param a
-
@param b
-
@return
*/
private static boolean greate(Comparable a,Comparable b){
return a.compareTo(b)>0;
}
/**
-
交换
-
@param a
-
@param i
-
@param j
*/
private static void each(Comparable[] a,int i,int j){
Comparable temp = a[i];
a[i]=a[j];
a[j]=temp;
}
}
测试类:
package com.tjcu;
import java.util.Arrays;
/**
-
@author 王恒杰
-
@version 1.0
-
@date 2021/9/22 8:55
-
@email 1078993387@qq.com
-
@Address 天津
-
@Description:
*/
public class TestBubble {
public static void main(String[] args) {
Integer[] arr={9,8,7,65,4,3,2,12};
Bubble.sort(arr);
System.out.println(Arrays.toString(arr));
}
}
四、冒泡排序的时间复杂度分析
冒泡排序使用了双层for循环,其中内层循环的循环体是真正完成排序的代码,所以,我们分析冒泡排序的时间复杂度,主要分析一下内层循环体的执行次数即可。
在最坏情况下,也就是假如要排序的元素为{6,5,4,3,2,1}逆序,那么:
元素比较的次数为:
(N-1)+(N-2)+(N-3)+…+2+1=((N-1)+1)*(N-1)/2=N^2/2-N/2;
元素交换的次数为:
(N-1)+(N-2)+(N-3)+…+2+1=((N-1)+1)*(N-1)/2=N^2/2-N/2;
总执行次数为:
(N2/2-N/2)+(N2/2-N/2)=N^2-N;
按照大O推导法则,保留函数中的最高阶项那么最终冒泡排序的时间复杂度为O(N^2).
五、冒泡排序综合题:
- 排序规则:数组两个相邻的元素依次比较,每次将最大的数值放到最后的位置
该图片详细记录冒泡排序执行流程,图是王宇希老师所画
- 代码实现
package com.tjcu;
import java.util.Arrays;
/**
-
@author 王恒杰
-
@version 1.0
-
@date 2021/9/22 9:47
-
@email 1078993387@qq.com
-
@Address 天津
-
@Description:
*/
public class BubbleDemo1 {
public static void main(String[] args) {
int[] a={1,2,3,4,56,7,8};
// 比较轮数应该是n-1
for (int i = 1; i <a.length ; i++) {
// 元素比较
for(int j=0;j<a.length-1;j++){
if (a[j] > a[j+1]) {
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
System.out.println(Arrays.toString(a));
}
}
- 优化一(减少头部有序区验证)
优化思想:如果本轮有交换则继续排序,如果本轮没交换则认为数组已称为有序数组,跳出大循环。
package com.tjcu;
import java.util.Arrays;
/**
-
@author 王恒杰
-
@version 1.0
-
@date 2021/9/22 9:47
-
@email 1078993387@qq.com
-
@Address 天津
-
@Description:
*/
public class BubbleDemo1 {
public static void main(String[] args) {
int[] a={1,2,8,4,56,7,9};
// 比较轮数应该是n-1
for (int i = 1; i <a.length ; i++) {
// 元素比较
Boolean isSort=true;
for(int j=0;j<a.length-1;j++){
if (a[j] > a[j+1]) {
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
isSort=false;
}
if(isSort){
break;
};
}
}
System.out.println(Arrays.toString(a));
}
}
- 优化二(减少尾部有序区验证)
优化思想:每次排序记录最后一次交换元素的位置,确认无序区边界,下次排序以边界为结束条件,减少多余的验证。
int[] a = {3,4,2,1,5,6,7,8};
int lastIndex = 0;
int sortedIndex = a.length -1;
for (int i = 1; i < a.length; i++) {
//有序标记,每一轮的初始是true
boolean isSorted = true;
for(int j=0; j<sortedIndex; j++){
if(a[j]>a[j+1]){
//交换元素位置
int temp = a[j];
a[j] = a[j+1];
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
同时减轻大家的负担。**
[外链图片转存中…(img-i2ab8Vux-1714882064656)]
[外链图片转存中…(img-bDpC5F7T-1714882064657)]
[外链图片转存中…(img-KJxPyEgM-1714882064657)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!