排序算法圖解之Java冒泡排序及優(yōu)化
1.冒泡排序簡介
冒泡排序(Bubble Sorting)即:通過對待排序的序列從前往后,依次比較相鄰元素的值,若發(fā)現(xiàn)逆序則交換位置,使較大的元素逐漸移動到后部,就像水底的氣泡一樣逐漸從水面冒出來,這就是冒泡名稱的由來
2.圖解算法
以將序列{3, 9, -1, 10, -20}從小到大排序為例!
基本思想就是,在每一趟排序?qū)崿F(xiàn)將最大的數(shù)移到序列的最后端!這主要通過比較相鄰兩個元素實現(xiàn),當相鄰的兩個元素逆序的時候,我們就交換它們。
第1趟排序:
第1趟排序共比較了4次,將最大的數(shù)10冒泡到了序列的尾部。
第2趟排序:
由于第一趟排序已經(jīng)將最大是數(shù)10給冒泡到了最末端,因此在本次排序中,不需要再比較最后一個元素,故共比較了3次,將子序列(前四個元素)中最大的數(shù)9(整個序列中倒數(shù)第二大的數(shù))冒泡到了子序列的尾端(原序列的倒數(shù)第二個位置)。
第3趟排序:
在第三趟排序時,同理,倒數(shù)兩個元素位置已經(jīng)確定,即第一、第二大的數(shù)已經(jīng)排好位置,只需要再將倒數(shù)第三大的數(shù)確認即可。故比較2次,實現(xiàn)倒數(shù)第三大的數(shù)3的位置確定。
第4趟排序:
在第四趟排序時,只有第一、第二個元素的位置還不確定,只需要比較一次,若逆序,則交換即可。到此,排序算法完成,原序列已經(jīng)排序成為一個遞增的序列!
小結
一共進行了數(shù)組大小-1次趟排序,即外層循環(huán)arr.length-1次;每趟排序進行了逐趟減小次數(shù)的比較,即內(nèi)層循環(huán)arr.length-i-1次,i從0依次增加。
3.冒泡排序代碼實現(xiàn)
參考代碼如下,為了便于觀察結果,在循環(huán)中添加了相應的輸出語句:
import java.util.Arrays; /** * @author 興趣使然黃小黃 * @version 1.0 * 冒泡排序 */ public class BubbleSort { public static void main(String[] args) { int[] array = {3, 9, -1, 10, -20}; //排序前 System.out.println("排序前:" + Arrays.toString(array)); //冒泡排序 for (int i = 0; i < array.length - 1; i++) { System.out.println("第" + (i+1) + "趟排序開始!"); for (int j = 0; j < array.length - i - 1; j++) { //如果前面的數(shù)比后面的數(shù)大,則交換 if(array[j] > array[j+1]){ //交換 int temp = array[j]; array[j] = array[j+1]; array[j+1] = temp; } System.out.println("------第" + (j+1) + "趟排序: " + Arrays.toString(array)); } System.out.println("第" + (i+1) + "趟排序完成: " + Arrays.toString(array)); System.out.println("================================================"); } //輸出排序后的結果 System.out.println("排序后:" + Arrays.toString(array)); } }
實現(xiàn)結果:
4.冒泡排序算法的優(yōu)化
舉個例子,將待排序的序列改為:{5,1,2,3,4},用以上算法來處理,觀察一下結果:
可以發(fā)現(xiàn),當?shù)谝惶伺判蚪Y束的時候,序列已經(jīng)排序完成: 即將5冒泡到了最后,序列實現(xiàn)了從小到大排序。但是原冒泡排序算法,還是義無反顧的進行了數(shù)組大小-1趟排序(我可真是大冤種?。?/strong>
因此,我們需要嘗試對算法進行優(yōu)化!
發(fā)現(xiàn):在冒泡排序的過程中,各個元素都在不斷的接近自己的位置,如果下一趟比較中沒有進行過任何交換,則說明序列已經(jīng)有序, 則排序算法已經(jīng)可以返回結果。因此,考慮在排序算法過程中添加一個標志flag判斷元素是否進行過交換,以減少不必要的冤種行為!
優(yōu)化代碼如下:
import java.util.Arrays; /** * @author 興趣使然黃小黃 * @version 1.0 * 冒泡排序優(yōu)化 */ public class BubbleSort { public static void main(String[] args) { int[] array = {5, 1, 2, 3, 4}; //排序前 System.out.println("排序前:" + Arrays.toString(array)); boolean flag = false; //用于標記是否進行了交換,true則說明進行了交換,false表示無 //冒泡排序 for (int i = 0; i < array.length - 1; i++) { System.out.println("第" + (i+1) + "趟排序開始!"); for (int j = 0; j < array.length - i - 1; j++) { //如果前面的數(shù)比后面的數(shù)大,則交換 if(array[j] > array[j+1]){ //交換 flag = true; //標記進行了交換 int temp = array[j]; array[j] = array[j+1]; array[j+1] = temp; } System.out.println("------第" + (j+1) + "趟排序: " + Arrays.toString(array)); } System.out.println("第" + (i+1) + "趟排序完成: " + Arrays.toString(array)); System.out.println("================================================"); if (!flag){ //如果沒有進行交換則直接退出,說明排序已經(jīng)完成 break; }else { //回退 flag = false; } } //輸出排序后的結果 System.out.println("排序后:" + Arrays.toString(array)); } }
四趟排序,優(yōu)化成了只需要兩趟排序!又是一個不可多得的小技巧!在算法程序題中,flag的設置是一種常用的編程思想,常常用于回溯算法中,小伙伴們要學會舉一反三~
到此這篇關于排序算法圖解之Java冒泡排序及優(yōu)化的文章就介紹到這了,更多相關Java冒泡排序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot實現(xiàn)前端驗證碼圖片生成和校驗
這篇文章主要為大家詳細介紹了SpringBoot實現(xiàn)前端驗證碼圖片生成和校驗,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-02-02出現(xiàn)SLF4J:?Failed?to?load?class?“org.slf4j.impl.StaticLog
本文主要介紹了出現(xiàn)SLF4J:?Failed?to?load?class?“org.slf4j.impl.StaticLoggerBinder“.的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-07-07SpringSecurity+JWT實現(xiàn)前后端分離的使用詳解
這篇文章主要介紹了SpringSecurity+JWT實現(xiàn)前后端分離的使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-01-01Eclipse 項目出現(xiàn)錯誤(紅色嘆號)解決方法
這篇文章主要介紹了Eclipse 項目出現(xiàn)錯誤(紅色嘆號)解決方法的相關資料,需要的朋友可以參考下2017-06-06SSH框架網(wǎng)上商城項目第3戰(zhàn)之使用EasyUI搭建后臺頁面框架
SSH框架網(wǎng)上商城項目第3戰(zhàn)之使用EasyUI搭建后臺頁面框架,討論兩種搭建方式:基于frameset和基于easyUI,感興趣的小伙伴們可以參考一下2016-05-05Java并發(fā)編程中的synchronized關鍵字詳細解讀
這篇文章主要介紹了Java并發(fā)編程中的synchronized關鍵字詳細解讀,在Java早期版本中,synchronized 屬于 重量級鎖,效率低下,這是因為監(jiān)視器鎖(monitor)是依賴于底層的操作系統(tǒng)的Mutex Lock來實現(xiàn)的,Java 的線程是映射到操作系統(tǒng)的原生線程之上的,需要的朋友可以參考下2023-12-12java文件復制代碼片斷(java實現(xiàn)文件拷貝)
本文介紹java實現(xiàn)文件拷貝的代碼片斷,大家可以直接放到程序里運行2014-01-01