Java冒泡排序及優(yōu)化介紹
什么是冒泡排序
冒泡排序指重復(fù)地走訪過要排序的元素列,依次比較兩個(gè)相鄰的元素,如果順序(如從小到大)錯(cuò)誤就把他們交換過來。走訪元素的工作是重復(fù)地進(jìn)行直到?jīng)]有相鄰元素需要交換,也就是說該元素列已經(jīng)排序完成。這個(gè)算法的名字由來是因?yàn)樵叫〉脑貢?huì)經(jīng)由交換慢慢“浮”到數(shù)列的頂端(升序或降序排列),就如同碳酸飲料中二氧化碳的氣泡最終會(huì)上浮到頂端一樣,故名“冒泡排序”。
思路分析
以{5,3,9,7,1}為例 要求排序后的數(shù)組元素順序按從小到大排序。依次比較相鄰的兩個(gè)數(shù)(藍(lán)色),將比較小的數(shù)放在前面,比較大的數(shù)放在后面。每一輪排序都能得到參與比較的數(shù)的最大值(紅色)
第一輪排序
5,3,9,7,1 //如果數(shù)大于相鄰的數(shù)就交換位置
3,5,9,7,1
3,5,9,7,1
3,5,7,9,1
3,5,7,1,9 //第一輪排序的結(jié)果
第二輪排序
3,5,7,1,9
3,5,7,1,9
3,5,7,1,9
3,5,1,7,9 //第二輪排序的結(jié)果
第三輪排序
3,5,1,7,9
3,5,1,7,9
3,1,5,7,9 //第三輪排序的結(jié)果
第四輪排序
3,1,5,7,9
1,3,5,7,9 //第四輪排序的結(jié)果
代碼實(shí)現(xiàn)
public class bubble { public static void main(String[] args) { int[] array = {5,3,9,7,1}; bubbleSort(array); } /** * 冒泡排序 */ public static void bubbleSort(int[] array){ int temp; //一共進(jìn)行l(wèi)ength-1次排序 for (int i = 0; i < array.length-1; i++) { //數(shù)組中沒有元素或者只有一個(gè)元素就無需排序 if(array==null || array.length < 2 ){ return; } //每進(jìn)行一次排序后參與比較的數(shù)量減一 for (int j = 0; j < array.length - 1 - i; j++) { if (array[j]>array[j+1]) { //互換元素位置 temp = array[j]; array[j]=array[j+1]; array[j+1]=temp; } } System.out.println("第"+(i+1)+"輪排序的結(jié)果是"+ Arrays.toString(array)); } return; } }
結(jié)果輸出
第1輪排序的結(jié)果是[3, 5, 7, 1, 9] 第2輪排序的結(jié)果是[3, 5, 1, 7, 9] 第3輪排序的結(jié)果是[3, 1, 5, 7, 9] 第4輪排序的結(jié)果是[1, 3, 5, 7, 9] Process finished with exit code 0
代碼優(yōu)化
根據(jù)上述算法發(fā)現(xiàn)對(duì)于長(zhǎng)度為n的數(shù)組需要進(jìn)行n-1輪排序才能算出最終的結(jié)果,但是并非所有數(shù)組都需要n-1次才能等要最終的排序結(jié)果,比如{1,2,3,5,4}我們發(fā)現(xiàn)這個(gè)數(shù)組只需經(jīng)過一次排序就能得到結(jié)果,那么如何對(duì)上面的代碼進(jìn)行優(yōu)化呢?只需判斷一輪排序下來有無出現(xiàn)元素互換位置就可以確定是否完成了排序。如果經(jīng)過一輪排序元素位置沒有發(fā)生互換說明排序已經(jīng)完成
public class bubblePlus { public static void main(String[] args) { int[] array = {1,2,3,5,4}; bubboSort(array); } /** *冒泡排序 */ public static void bubboSort(int[] array){ int temp; //判斷是否有元素進(jìn)行交換 boolean flag = false; for (int i = 0; i < array.length-1; i++) { if(array==null || array.length < 2 ){ return; } //每進(jìn)行一次排序后參與比較的數(shù)量減一 for (int j = 0; j < array.length - 1 - i; j++) { if (array[j]>array[j+1]) { //位置交換就改為true flag = true; temp = array[j]; array[j]=array[j+1]; array[j+1]=temp; } } if (!flag){ //位置沒有發(fā)生交換說明排序已經(jīng)完成 break; }else{ //位置發(fā)生改變需要將flag重新置為false以便于下一輪的判斷 System.out.println("第"+(i+1)+"輪排序的結(jié)果是"+ Arrays.toString(array)); flag = false; } } return; } }
優(yōu)化后的結(jié)果輸出
第1輪排序的結(jié)果是[1, 2, 3, 4, 5] Process finished with exit code 0
到此這篇關(guān)于Java冒泡排序及優(yōu)化介紹的文章就介紹到這了,更多相關(guān)Java冒泡排序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring boot@EnableXXXX注解編程模型講解
這篇文章主要介紹了spring boot@EnableXXXX注解編程模型,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09總結(jié)一下Java回調(diào)機(jī)制的相關(guān)知識(shí)
今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識(shí),文章圍繞著Java回調(diào)機(jī)制展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06java String 類的一些理解 關(guān)于==、equals、null
在對(duì)字符串的相等判斷,==判斷的是地址是否相同,equal()判斷的是字符值是否相同。大多數(shù)時(shí)候==跟equal()的結(jié)果都是相同的。2009-06-06springboot數(shù)據(jù)庫(kù)密碼加密的配置方法
這篇文章主要給大家介紹了關(guān)于springboot數(shù)據(jù)庫(kù)密碼加密的配置方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04Netty4之如何實(shí)現(xiàn)HTTP請(qǐng)求、響應(yīng)
這篇文章主要介紹了Netty4之如何實(shí)現(xiàn)HTTP請(qǐng)求、響應(yīng)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04Spring生命周期回調(diào)與容器擴(kuò)展詳解
這篇文章主要介紹了Spring生命周期回調(diào)與容器擴(kuò)展詳解,具有一定借鑒價(jià)值,需要的朋友可以參考下。2017-12-12淺談web服務(wù)器項(xiàng)目中靜態(tài)請(qǐng)求和動(dòng)態(tài)請(qǐng)求處理
這篇文章主要介紹了淺談web服務(wù)器項(xiàng)目中靜態(tài)請(qǐng)求和動(dòng)態(tài)請(qǐng)求處理,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07java 查找list中重復(fù)數(shù)據(jù)實(shí)例詳解
這篇文章主要介紹了java 查找list中重復(fù)數(shù)據(jù)實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-01-01