Java排序算法中的冒泡排序算法實(shí)現(xiàn)
Java冒泡排序算法
1、冒泡排序原理
冒泡排序只會操作相鄰的兩個(gè)數(shù)據(jù)。
每次冒泡操作都會對相鄰的兩個(gè)元素進(jìn)行比較,看是否滿足大小關(guān)系要求。
如果不滿足就讓它倆互換。一次冒泡會讓至少一個(gè)元素移動(dòng)到它應(yīng)該在的位置,重復(fù) n 次,就完成了 n 個(gè)數(shù)據(jù)的排序工作。
如果我們要對一組數(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)識符,來判斷當(dāng)前是否還有數(shù)據(jù)交換
經(jīng)過優(yōu)化,對 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)識當(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ù)在排序前后不會改變順序,所以冒泡排序是穩(wěn)定的排序算法。
到此這篇關(guān)于Java排序算法中的冒泡排序算法實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Java冒泡排序算法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java synchronized同步靜態(tài)方法和同步非靜態(tài)方法的異同
這篇文章主要介紹了java synchronized同步靜態(tài)方法和同步非靜態(tài)方法的異同的相關(guān)資料,需要的朋友可以參考下2017-01-01Spring的@Validation和javax包下的@Valid區(qū)別以及自定義校驗(yàn)注解
這篇文章主要介紹了Spring的@Validation和javax包下的@Valid區(qū)別以及自定義校驗(yàn)注解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01詳解SpringBoot中的tomcat優(yōu)化和修改
這篇文章主要介紹了詳解SpringBoot中的tomcat優(yōu)化和修改,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09Intellij IDEA導(dǎo)入eclipse web項(xiàng)目的操作步驟詳解
Eclipse當(dāng)中的web項(xiàng)目都會有這兩個(gè)文件,但是idea當(dāng)中應(yīng)該是沒有的,所以導(dǎo)入會出現(xiàn)兼容問題,但是本篇文章會教大家如何導(dǎo)入,并且導(dǎo)入過后還能使用tomcat運(yùn)行,需要的朋友可以參考下2023-08-08基于JavaSwing+mysql開發(fā)一個(gè)學(xué)生社團(tuán)管理系統(tǒng)設(shè)計(jì)和實(shí)現(xiàn)
項(xiàng)目使用Java swing+mysql開發(fā),可實(shí)現(xiàn)基礎(chǔ)數(shù)據(jù)維護(hù)、用戶登錄注冊、社團(tuán)信息列表查看、社團(tuán)信息添加、社團(tuán)信息修改、社團(tuán)信息刪除以及退出注銷等功能、界面設(shè)計(jì)比較簡單易學(xué)、適合作為Java課設(shè)設(shè)計(jì)以及學(xué)習(xí)技術(shù)使用,需要的朋友參考下吧2021-08-08Java concurrency之AtomicReference原子類_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
AtomicReference是作用是對"對象"進(jìn)行原子操作。這篇文章主要介紹了Java concurrency之AtomicReference原子類,需要的朋友可以參考下2017-06-06