經典冒泡排序及其優化

經典排序算法 - 冒泡排序Bubble sort

原理是臨近的數字兩兩進行比較,按照從小到大或者從大到小的順序進行交換,這樣一趟過去后,最大或最小的數字被交換到了最后一位,然后再從頭開始進行兩兩比較交換,直到倒數第二位時結束,其余類似,看例子。

例子為從小到大排序,為了便于觀察,選取

原始待排序數組:| 6 | 2 | 4 | 1 | 5 | 9 |

第一趟排序(外循環)

第一次兩兩比較6 > 2交換(內循環)

交換前狀態| 6 | 2 |?4 | 1 | 5 | 9 |

交換后狀態| 2 | 6 |?4 | 1 | 5 | 9 |

?

第二次兩兩比較,6 > 4交換

交換前狀態| 2?| 6 | 4 |?1 | 5 | 9 |

交換后狀態| 2?| 4 | 6 |?1 | 5 | 9 |

?

第三次兩兩比較,6 > 1交換

交換前狀態| 2 | 4?| 6 | 1 |?5 | 9 |

交換后狀態| 2 | 4?| 1 | 6 |?5 | 9 |

?

第四次兩兩比較,6 > 5交換

交換前狀態| 2 | 4 | 1?| 6 | 5 |?9 |

交換后狀態| 2 | 4 | 1?| 5 | 6 |?9 |

?

第五次兩兩比較,6 < 9不交換

交換前狀態| 2 | 4 | 1 | 5?| 6 | 9 |

交換后狀態| 2 | 4 | 1 | 5?| 6 | 9 |

?

第二趟排序(外循環)

第一次兩兩比較2 < 4不交換

交換前狀態| 2 | 4 |?1 | 5 | 6 | 9 |

交換后狀態| 2 | 4 |?1 | 5 | 6 | 9 |

?

第二次兩兩比較,4 > 1交換

交換前狀態| 2?| 4 | 1 |?5 | 6 | 9 |?
交換后狀態| 2?| 1 | 4 |?5 | 6 | 9 |

?

第三次兩兩比較,4 < 5不交換

交換前狀態| 2 | 1?| 4 | 5 |?6 | 9 |?
交換后狀態| 2 | 1?| 4 | 5 |?6 | 9 |

?

第四次兩兩比較,5 < 6不交換

交換前狀態| 2 | 1 | 4?| 5 | 6 |?9 |

交換后狀態| 2 | 1 | 4?| 5 | 6 |?9 |

?

第三趟排序(外循環)

第一次兩兩比較2 > 1交換

交換后狀態| 2 | 1 |?4 | 5 | 6 | 9 |

交換后狀態| 1 | 2 |?4 | 5 | 6 | 9 |

?

第二次兩兩比較,2 < 4不交換

交換后狀態| 1?| 2 | 4 |?5 | 6 | 9 |?
交換后狀態| 1?| 2 | 4 |?5 | 6 | 9 |

?

第三次兩兩比較,4 < 5不交換

交換后狀態| 1 | 2?| 4 | 5 |?6 | 9 |?
交換后狀態| 1 | 2?| 4 | 5 |?6 | 9 |

?

第四趟排序(外循環)無交換

第五趟排序(外循環)無交換


排序完畢,輸出最終結果1 2 4 5 6 9


下面是代碼實現(僅供參考),為了更直觀地表示優化結果,選取

原始待排序數組:|2|1|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|

public class BubbleSort2 {public int[] bubbleSort(int[] A, int n) {boolean flag = true;for (int i = 0; i < n && flag; i++) {flag = false;for (int j = i; j < n; j++) {if (A[i] > A[j]) {int temp = A[i];A[i] = A[j];A[j] = temp;flag = true;}}}return A;}public static void main(String args[]) {int A[] = { 2, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 };int n = A.length;BubbleSort bubbleSort = new BubbleSort();double start = System.currentTimeMillis();int B[] = bubbleSort.bubbleSort(A, n);for (int i = 0; i < n; i++)System.out.print(B[i] + ",");double end = System.currentTimeMillis();System.out.println("\n程序運行時間:" + (end - start) + "毫秒");}
}

輸出:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,
程序運行時間:1.0毫秒

顯然,這樣的程序是有問題的。因為除了第一和第二個關鍵字需要交換外,別的都已經是正常順序,,當 i=1 時,交換了2和1,此時序列已經有序,但是算法仍然不依不饒地將 i=2 到 i=29 比較一遍。盡管并沒有交換數據,但是之后的大量比較還是大大多余了。


public class BubbleSort2 {public int[] bubbleSort(int[] A, int n) {boolean flag = true;// flag作為標記for (int i = 0; i < n && flag; i++) {// 當flag為true時退出循環flag = false;// 初始flag為falsefor (int j = i; j < n; j++) {if (A[i] > A[j]) {int temp = A[i];A[i] = A[j];A[j] = temp;flag = true;// 如果有數據交換,則flag為true}}}return A;}public static void main(String args[]) {int A[] = { 2, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 };int n = A.length;BubbleSort bubbleSort = new BubbleSort();double start = System.currentTimeMillis();int B[] = bubbleSort.bubbleSort(A, n);for (int i = 0; i < n; i++)System.out.print(B[i] + ",");double end = System.currentTimeMillis();System.out.println("\n程序運行時間:" + (end - start) + "毫秒");}
}


輸出:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,
程序運行時間:0.0毫秒


由此可見,稍微加個flag,程序運行時間縮短了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/386018.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/386018.shtml
英文地址,請注明出處:http://en.pswp.cn/news/386018.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

expdp導出 schema_記錄一則expdp任務異常處理案例

在XTTS遷移測試階段&#xff0c;遇到執行幾個expdp的導出任務&#xff0c;遲遲沒有返回任何信息&#xff0c;對應日志無任何輸出。環境&#xff1a;AIX 6.1 Oracle 10.2.0.4現象&#xff1a;在XTTS遷移測試階段&#xff0c;遇到執行幾個expdp的導出任務&#xff0c;遲遲沒有返…

java開發工具軟件排行榜

前言&#xff1a; 都說學歷是敲門磚&#xff0c;是一點都沒錯&#xff0c;即使是在重技術輕學歷的互聯網企業&#xff0c;面試官對于學歷越高的程序員初印象會更好&#xff0c;面試也會更順利&#xff0c;而大部分專科學歷的程序員&#xff0c;除非有過硬的技術&#xff0c;否…

簡單選擇排序算法

簡單選擇排序思想&#xff1a;首先&#xff0c;找到數組中最小的元素&#xff0c;其次&#xff0c;將它和數組第一個元素交換位置&#xff1b;再次&#xff0c;在剩下的元素中找到最小的元素&#xff0c;將它與數組中的第二個元素交換。如此亡故&#xff0c;直到將整個數組排序…

java開發工程師工作內容怎么寫

什么是分布式鎖&#xff1f;在回答這個問題之前&#xff0c;我們先回答一下什么是鎖。 普通的鎖&#xff0c;即在單機多線程環境下&#xff0c;當多個線程需要訪問同一個變量或代碼片段時&#xff0c;被訪問的變量或代碼片段叫做臨界區域&#xff0c;我們需要控制線程一個一個…

community 計算模塊度_光模塊深度:國內光模塊企業快速崛起

一、核心觀點二、發展追溯:技術是底蘊、創新是動力1 光通信發展:技術迭代加快&#xff0c;國產替代是前進的方向依據摩爾定律&#xff0c;光模塊的小型化、低成本以及高速率是產品迭代的主要方向。2 競爭格局:市場集中度高&#xff0c;巨頭地位穩固&#xff0c;國內廠商穩步崛起…

java開發工程師的自我評價

前言 京東到家訂單中心系統業務中&#xff0c;無論是外部商家的訂單生產&#xff0c;或是內部上下游系統的依賴&#xff0c;訂單查詢的調用量都非常大&#xff0c;造成了訂單數據讀多寫少的情況。 我們把訂單數據存儲在MySQL中&#xff0c;但顯然只通過DB來支撐大量的查詢是不…

華為魔術手機拆機圖解_華為P9進水不顯示維修案例

看點&#xff1a;iPhone X原裝屏與國產屏有哪些區別&#xff1f;看點&#xff1a;換7P、8P屏幕&#xff1a;C11和DTP和DKH的區別獅淘&#xff1a;華人手機維修師專屬工具集合店&#xff0c;不銹鋼拆機片5個只需9.9元&#xff01;包郵山貓潮品&#xff1a;手機渠道直供&#xff…

java開發工程師自我介紹文本

前言 每年金三銀四&#xff0c;金九銀十之際&#xff0c;想進階夢想挑戰大廠的朋友層出不窮。 夢想是要有的&#xff0c;萬一就實現了呢&#xff1f;且撇開大牛們不說&#xff0c;每年面試之時問題也層出不窮&#xff0c;不得不說&#xff0c;每年被算法絕殺的朋友也是不在少數…

面向對象技術

面向對象和面向過程的區別 出發點不同。 面向對象強調問題域的要領直接映射到對象和對象之間的接口上&#xff0c;是用符合常規思維的方式來處理客觀世界的問題。 面向過程方法強調的則是過程的抽象化和模塊化&#xff0c;是以過程為中心構造或處理客觀世界問題的。層次邏輯…

ad09只在一定范圍內查找相似對象_23、面向對象編程

目錄&#xff1a;對象的概念類與對象面向對象編程類的定義與實例化屬性訪問類屬性與對象屬性屬性查找順序與綁定方法小結視頻鏈接一 對象的概念”面向對象“的核心是“對象”二字&#xff0c;而對象的精髓在于“整合“&#xff0c;什么意思&#xff1f;所有的程序都是由”數據”…

java開發工程師轉行可以做什么

前言 分布式事務主要解決分布式一致性的問題。說到底就是數據的分布式操作導致僅依靠本地事務無法保證原子性。與單機版的事務不同的是&#xff0c;單機是把多個命令打包成一個統一處理&#xff0c;分布式事務是將多個機器上執行的命令打包成一個命令統一處理。 MySQL 提供了…

atlas怎么看日志_億級的日志治理!微服務最佳方案,ELK stack從零搭建

ELK Stack 誕生背景一般我們需要進行日志分析場景&#xff1a;直接在日志文件中 grep、awk 就可以獲得自己想要的信息。但在規模較大的場景中&#xff0c;此方法效率低下&#xff0c;面臨問題包括日志量太大如何歸檔、文本搜索太慢怎么辦、如何多維度查詢。需要集中化的日志管理…

Java變量類型

所有的變量在使用前必須聲明。 type identifier [ value][, identifier [ value] ...] ; 格式說明&#xff1a;type是數據類型&#xff0c;identifier是變量名&#xff0c;可以使用逗號隔開來聲明多個同類型變量。 一下列出一些變量的聲明實例&#xff0c;有些包含了初始化過…

java開發工程師面試問題大全及答案大全

前言 Alibaba作為國內互聯網行業的“老大”&#xff0c;一直以來也是很多“數碼寶貝”夢寐以求的公司&#xff0c;我個人是做Java開發的&#xff0c;阿里這些年也開發了很多屌炸天的開源項目&#xff0c;像什么Spring Cloud Alibaba&#xff0c;開源Java診斷工具Arthas&#x…

me shy是什么歌 抖音make_內含活動福利 | 小紅書、抖音爆贊的高顏值的北歐家居神店開到卜蜂中心啦!...

幾個月前&#xff0c;一家北歐范顏值爆表的瑞典獨立設計師品牌家居店憑借其充滿設計感的產品刷爆社交媒體微博、小紅書、抖音經常出現它的身影隨便一篇閱讀量、收藏量都好幾萬數不清的爆like讓人按耐不住了&#xff01;這個品牌叫NǒME家居(認住這個正版的ǒ)&#xff0c;開到哪…

java開發工程師面試題及答案

前言 作為一名編程人員&#xff0c;對MySQL一定不會陌生&#xff0c;尤其是互聯網行業&#xff0c;對MySQL的使用是比較多的。對于求職者來說&#xff0c;MySQL又是面試中一定會問到的重點&#xff0c;很多人擁有大廠夢&#xff0c;卻因為MySQL敗下陣來。實際上&#xff0c;My…

呂玉琴考研指導電子版_【干貨大放送】中國歷代文學作品選閱讀指導PDF

跟緊我&#xff0c;來年輕松收獲錄取通知書~長按一戰成碩hello&#xff0c;我是小致帶你考研上路今天給大家分享的干貨內容是《歷代文學作品選》閱讀指導之前1000題濃縮資料&#xff0c;后臺回復【濃縮】獲取不要再留郵箱了&#xff0c;直接后臺獲取本次資料由致遠文學考研原創…

java開發工程師面試題總結

一、背景 我們日常在電商網站購物時經常會遇到一些高并發的場景&#xff0c;例如電商 App 上經常出現的秒殺活動、限量優惠券搶購&#xff0c;還有我們去哪兒網的火車票搶票系統等&#xff0c;這些場景有一個共同特點就是訪問量激增&#xff0c;雖然在系統設計時會通過限流、異…

Java重寫和重載

重寫&#xff08;Override&#xff09; 重寫是子類重寫父類的方法&#xff0c;如果重寫了父類的方法&#xff0c;訪問時父類的方法就會被覆蓋&#xff0c;如果想要再訪問父類的同名方法&#xff0c;要用super關鍵字。重寫的好處在于子類可以根據自己的需要&#xff0c;定義特定…

7天拿到阿里Android崗位offer,都是精髓!

食用指南 和大部分人一樣&#xff0c;我在復習完第一遍Android知識的情況下&#xff0c;看到相關的知識回答的仍然不能夠令自己滿意。 在第二遍系統復習的時候&#xff0c;我著重記住每個知識點的關鍵字&#xff0c;根據這些關鍵字拼湊出大概的知識點&#xff0c;最后看到每個…