“365算法每日学计划”:05打卡-图解冒泡排序(多解法)
文章有不當之處,歡迎指正,如果喜歡微信閱讀,你也可以關注我的微信公眾號:好好學java,獲取優質學習資源。
一、思路
在進行冒泡法排序(升序)時,需要將數組元素(len)兩兩比較,如果
前面的元素大于后面的元素,則交換兩個數,否則,比較下一個元素和它的下一個元素的大小,依次執行,執行一次循環,可以找到當前數組中最大的一個元素,然后問題規模變小,然后找出len-1個元素里的最大值,使之成為第二大元素,依次執行,需要在外層嵌套一層循環。
二、優化
考慮如果數組中的數據已經是排好序的,那么就不需要遍歷那么多次,定義一個標志位,如果沒有執行交換,則說明數組中的元素已經排好序了,這時直接跳出循環。
三、圖解
四、代碼實現
假如有幾個數字int score[] = {67, 69, 75, 88}; 按照從大到小排序。
有2種思路
第一種,score[j] 和 score[j+1] 比較 如果 前者比后者小,把前者和后者調換順序,兩兩調換后一輪下來 最小的會被排到最后去。每一輪j都從0開始,當i輪排序,就有最后面的i個數字因為他是最小的,所以后面的每輪都不用理他了,也就是 score.length-1-i 往后的數不用管了,如上,第一輪有4個數字 i為0 ,那么score.length-1-i 為3,也就是下標是3以后的可以不用管,3往后沒有數字,所以第一輪所有的數字都要參加比較,第二輪I=1 score.length-1-i 為2 也就是說 下標2后面的 下標為3的數字不用比了,因為兩兩比較厚,67會到 score[3],實現代碼如下:
for(int i =0;i < score.length - 1;i++) { for(int j = 0;j < score.length - 1-i;j++)// j開始等于0, { if(score[j] < score[j+1]) { int temp = score[j]; score[j] = score[j+1]; score[j+1] = temp; } } }第二種思路,用88 和 75 比較,在和69 比較 在和 67 比較,發現88是最大的,吧他排到第一位(index=0的位置),然后i=1,也就是第二輪,就不用看下標為0的88了因為他是老大,然后接著比較。;
for(int i =0;i < score.length - 1;i++) { for(int j = (score.length - 2);j >= i;j--) { if(score[j] < score[j+1]) { int temp = score[j]; score[j] = score[j+1]; score[j+1] = temp; } } }說明下j為啥=
(score.length - 2)因為length=4,我最多能讓下標2和下標3的數字比較(j+1最大等于3),也就是4-2=2 j最大=2,2和2+1比較 然后1和2比較,然后 0和1 比較。
五、時間復雜度分析
最好的情況下時間復雜度為O(n):當待排序的數據已經按順序排好的情況下
最壞的情況下時間復雜度為O(n^2):因為要比較n-1趟,,每一趟又要比較(n-1-i)次
參考資料
- https://blog.csdn.net/qq_34992845/article/details/53271184
- https://blog.csdn.net/shuaizai88/article/details/73250615
總結
以上是生活随笔為你收集整理的“365算法每日学计划”:05打卡-图解冒泡排序(多解法)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “面试不败计划”:集合知识整体总结
- 下一篇: “面试不败计划”:集合、日期、异常、序列