Java排序算法中的冒泡排序算法實(shí)現(xiàn)
Java冒泡排序算法
1、冒泡排序原理
冒泡排序只會(huì)操作相鄰的兩個(gè)數(shù)據(jù)。
每次冒泡操作都會(huì)對(duì)相鄰的兩個(gè)元素進(jìn)行比較,看是否滿足大小關(guān)系要求。
如果不滿足就讓它倆互換。一次冒泡會(huì)讓至少一個(gè)元素移動(dòng)到它應(yīng)該在的位置,重復(fù) n 次,就完成了 n 個(gè)數(shù)據(jù)的排序工作。
如果我們要對(duì)一組數(shù)據(jù) 4,5,6,3,2,1從小到到大進(jìn)行排序,第一次冒泡操作的詳細(xì)過程就是這樣:
- 4和5比較,4小于5,不進(jìn)行位置交換,結(jié)果:[4,5,6,3,2,1]
- 5和6比較,5小于6,不進(jìn)行位置交換,結(jié)果:[4,5,6,3,2,1]
- 6和3比較,6大于3,進(jìn)行位置交換,結(jié)果:[4,5,3,6,2,1]
- 6和2比較,6大于2,進(jìn)行位置交換,結(jié)果:[4,5,3,2,6,1]
- 6和1比較,6大于1,進(jìn)行位置交換,結(jié)果:[4,5,3,2,1,6]
要想完成所有數(shù)據(jù)的排序,只要進(jìn)行 6 次這樣的冒泡操作就可以了:
| 冒泡次數(shù) | 冒泡后的結(jié)果 |
| 初始狀態(tài) | [ 4 ,5,6,3, 2, 1] |
| 第一次 冒泡 | [ 4 ,5,3,2, 1, 6] |
| 第二次 冒泡 | [ 4 ,3,1,1, 5, 6] |
| 第三次 冒泡 | [ 3 ,2,1,4, 5, 6] |
| 第四次 冒泡 | [ 2 ,1,3,4, 5, 6] |
| 第五次 冒泡 | [ 1,2,3,4, 5, 6] |
| 第六次 冒泡 | [ 1,2,3,4, 5, 6] |
2、代碼實(shí)現(xiàn)
* 從小到大排序
* @param a
* @return
*/
public static int[] bubbleSort(int[] a){
if (a.length<=1)
return a;
//外層for總共冒泡操作的次數(shù)
for (int i=0;i<a.length-1;i++){
//內(nèi)層for 兩個(gè)元素的交換
for (int j=0;j<a.length-i-1;j++){
if (a[j]>a[j+1]){
//交換數(shù)據(jù)
int tmp=a[j];
a[j]=a[j+1];
a[j+1]=tmp;
}
}
}
return a;
}3、冒泡排序優(yōu)化
通過上圖,我們發(fā)現(xiàn)在第五次冒泡操作后,已經(jīng)沒有數(shù)據(jù)交換,這時(shí)已經(jīng)達(dá)到完全有序,不用再繼續(xù)執(zhí)行后續(xù)的冒泡操作,我們可以通過添加一個(gè)標(biāo)識(shí)符,來判斷當(dāng)前是否還有數(shù)據(jù)交換
經(jīng)過優(yōu)化,對(duì) 4,5,6,3,2,1這組數(shù)據(jù)排序,只需執(zhí)行5次冒泡操作。
| 冒泡次數(shù) | 冒泡后的結(jié)果 | 是否有數(shù)據(jù)交換初始狀態(tài) |
| 初始狀態(tài) | [ 4 ,5,6,3, 2, 1] | ---- |
| 第一次 冒泡 | [ 4 ,5,3,2, 1, 6] | 有 |
| 第二次 冒泡 | [ 4 ,3,1,1, 5, 6] | 有 |
| 第三次 冒泡 | [ 3 ,2,1,4, 5, 6] | 有 |
| 第四次 冒泡 | [ 2 ,1,3,4, 5, 6] | 有 |
| 第五次 冒泡 | [ 1,2,3,4, 5, 6] | 無 |
代碼實(shí)現(xiàn):
/**
* 從小到大排序
* @param a
* @return
*/
public static int[] bubbleSort(int[] a){
if (a.length<=1)
return a;
//外層for總共冒泡操作的次數(shù)
for (int i=0;i<a.length-1;i++){
//標(biāo)識(shí)當(dāng)前冒泡操作是否有數(shù)據(jù)交換
boolean flag=false;
//內(nèi)層for 兩個(gè)元素的交換
for (int j=0;j<a.length-i-1;j++){
if (a[j]>a[j+1]){
//交換數(shù)據(jù)
int tmp=a[j];
a[j]=a[j+1];
a[j+1]=tmp;
flag=true;
}
}
//如果數(shù)據(jù)已經(jīng)有序,無需再執(zhí)行冒泡操作
if (!flag) break;
}
return a;
}4、算法分析
4.1、時(shí)間復(fù)雜度
- 最好情況:T(n)=O(n)
- 最壞情況:T(n)=O(n^2)
- 平均情況:T(n)=O(n^2)
4.2、是否穩(wěn)定
在冒泡排序中,只有交換才可以改變兩個(gè)元素的前后順序。為了保證冒泡排序算法的穩(wěn)定性,當(dāng)有相鄰的兩個(gè)元素大小相等的時(shí)候,我們不做交換,相同大小的數(shù)據(jù)在排序前后不會(huì)改變順序,所以冒泡排序是穩(wěn)定的排序算法。
到此這篇關(guān)于Java排序算法中的冒泡排序算法實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Java冒泡排序算法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
@DS注解的使用,動(dòng)態(tài)數(shù)據(jù)源,事務(wù)詳解
在項(xiàng)目中使用多數(shù)據(jù)源時(shí),可以借助苞米豆的dynamic-datasource-spring-boot-starter進(jìn)行配置,首先需引入相應(yīng)的jar包,并在application.yml中設(shè)置主從數(shù)據(jù)源,其中一般選擇master作為默認(rèn)數(shù)據(jù)源,在實(shí)現(xiàn)類中通過@DS注解指定數(shù)據(jù)源2024-09-09
Java利用條件運(yùn)算符的嵌套來完成學(xué)習(xí)成績(jī)的劃分
這篇文章主要介紹了Java利用條件運(yùn)算符的嵌套來完成學(xué)習(xí)成績(jī)的劃分,需要的朋友可以參考下2017-02-02
Spring Boot 配置加載全解析從 @ComponentScan 到自動(dòng)配
本文給大家介紹了Spring Boot 配置加載全解析從@ComponentScan到自動(dòng)配置原理,通過實(shí)戰(zhàn)案例展示了如何基于@Conditional實(shí)現(xiàn)JDK版本條件裝配,并了詳細(xì)步驟和配置原理,感興趣的朋友一起看看吧2026-05-05
簡(jiǎn)單講解在Java編程中實(shí)現(xiàn)設(shè)計(jì)模式中的單例模式結(jié)構(gòu)
這篇文章主要介紹了簡(jiǎn)單講解在Java編程中實(shí)現(xiàn)設(shè)計(jì)模式中的單例模式結(jié)構(gòu),設(shè)計(jì)模式是最基本直白簡(jiǎn)單的一種設(shè)計(jì)模式,需要的朋友可以參考下2016-04-04
SpringBoot實(shí)現(xiàn)郵件發(fā)送的示例代碼
電子郵件是—種用電子手段提供信息交換的通信方式,是互聯(lián)網(wǎng)應(yīng)用最廣的服務(wù)。本文詳細(xì)為大家介紹了SpringBoot實(shí)現(xiàn)發(fā)送電子郵件功能的示例代碼,需要的可以參考一下2022-04-04
IDEA實(shí)現(xiàn)添加 前進(jìn)后退 到工具欄的操作
這篇文章主要介紹了IDEA 前進(jìn) 后退 添加到工具欄的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-02-02
Java利用ElasticSearch實(shí)現(xiàn)增刪改功能
這篇文章主要為大家詳細(xì)介紹了Java如何利用ElasticSearch實(shí)現(xiàn)增刪改功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-08-08

