摘要:簡單實現左邊是大不是正常的排序順序的做交換考慮優化優化冒泡排序優化版本,節約有序的第一輪,永遠是找到最大的第二輪,找到的是第二大的,所以右邊個永遠是有序的如果有一種特殊情況,右邊經過對比,發現不需要交換了,那就是后面的都是最大的。
No bb . Show me the code1. 簡單實現
public static long sort(int[] intArr) { int arrLen = intArr.length; long recycleNum = 0; if (0 == arrLen) { return recycleNum; } for (int i = 0; i < arrLen; i++) { for (int j = 0; j < arrLen - 1; j++) { recycleNum++; // 左邊是大(不是正常的排序順序)的做交換 if (intArr[j] > intArr[j + 1]) { int temp = intArr[j]; intArr[j] = intArr[j + 1]; intArr[j + 1] = temp; } } } return recycleNum; }
考慮優化
2. 優化/** * 冒泡排序-優化版本,節約有序的 * * @param intArr */ public static long sortPlus(int[] intArr) { // 第一輪,永遠是找到最大的 // 第二輪,找到的是第二大的,所以右邊 n 個永遠是有序的 // 如果有一種特殊情況,右邊經過對比,發現不需要交換了,那就是后面的都是最大的。 有一個不是前面對比最大的,就會發生交換 // 加一個標記位,不發生交換的位置,就是比較的end // 這樣 原則上 1,2,3,4,5,6,7,8 只需要比較一輪 int arrLen = intArr.length; long recycleNum = 0; if (0 == arrLen) { return recycleNum; } boolean isSorted = true; for (int i = 0; i < arrLen; i++) { for (int j = 0; j < arrLen - 1; j++) { recycleNum++; // 左邊是大(不是正常的排序順序)的做交換 if (intArr[j] > intArr[j + 1]) { int temp = intArr[j]; intArr[j] = intArr[j + 1]; intArr[j + 1] = temp; // 發生了交換 isSorted = false; } } // TODO mark 是不是 j 都遍歷一遍 只是增加了 判斷。 反而增加了邏輯判斷 if (isSorted) { break; } } return recycleNum; }3. 有序區
/** * 冒泡排序-有序區 * * @param intArr */ public static long sortOrdered(int[] intArr) { int arrLen = intArr.length; int lastExchangeIndex = arrLen; int sortLen = arrLen - 1; long recycleNum = 0; if (0 == arrLen) { return recycleNum; } boolean isSorted = true; for (int i = 0; i < arrLen; i++) { for (int j = 0; j < sortLen; j++) { recycleNum++; // 左邊是大(不是正常的排序順序)的做交換 if (intArr[j] > intArr[j + 1]) { int temp = intArr[j]; intArr[j] = intArr[j + 1]; intArr[j + 1] = temp; // 發生了交換 isSorted = false; // 排序后的位置一定是有序的期間 lastExchangeIndex = j; } } // 節約空間,如果已經有序,不對比那么多,縮短長度 // 為了不影響 j 循環,循環結束后引入新的變量 sortLen = lastExchangeIndex; if (isSorted) { break; } } return recycleNum; }4. 測試代碼
/** * 循環次數,測試性能 */ private static final int NUM = 1; public static void main(String[] args) { //獲取開始時間 long startTime = System.currentTimeMillis(); for (int i = 0; i < NUM; i++) { int[] intArr = new int[]{3, 4, 2, 1, 5, 6, 7, 8, 11}; // 72 // long recycleNum = sort(intArr); // 72 long recycleNum = sortPlus(intArr); // 11 // long recycleNum = sortOrdered(intArr); System.out.println("循環次數:" + recycleNum); // System.out.println(Arrays.toString(intArr)); } // 獲取結束時間 long endTime = System.currentTimeMillis(); System.out.println("程序運行時間: " + (endTime - startTime) + "ms"); }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/74883.html
摘要:之所以把冒泡排序選擇排序插入排序放在一起比較,是因為它們的平均時間復雜度都為。其中,冒泡排序就是原地排序算法。所以冒泡排序是穩定的排序算法。選擇排序思路選擇排序算法的實現思路有點類似插入排序,也分已排序區間和未排序區間。 showImg(https://segmentfault.com/img/bVbuvnj?w=900&h=250); 1. 前言 算法為王。 想學好前端,先練好內功,...
摘要:多練練排序算法,不僅能夠讓我們知道一些排序方法的底層實現細節,更能夠鍛煉我們的思維,提升編程能力。排序算法的穩定性一個穩定的排序,指的是在排序之后,相同元素的前后順序不會被改變,反之就稱為不穩定。 1. 導言 因為這是排序算法系列的第一篇文章,所以多啰嗦幾句。 排序是很常見的算法之一,現在很多編程語言都集成了一些排序算法,比如Java 的Arrays.sort()方法,這種方式讓我們可...
摘要:本文對一些排序算法進行了簡單分析,并給出了的代碼實現。平均時間復雜度不好分析,它是冒泡排序是穩定的排序算法。冒泡排序是原地排序算法原地排序指的是空間復雜度是的排序算法。歸并排序,會將數組從中間分成左右兩部分。 本文對一些排序算法進行了簡單分析,并給出了 javascript 的代碼實現。因為本文包含了大量的排序算法,所以分析不會非常詳細,適合有對排序算法有一定了解的同學。本文內容其實不...
摘要:經過一次冒泡排序,最終在無序表中找到一個最大值,第一次冒泡結束。也是我們后面要說的冒泡排序的優化。冒泡排序只執行第一層循環,而不會執行第二層循環。因此冒泡排序的時間復雜度是。 showImg(https://user-gold-cdn.xitu.io/2019/6/19/16b6f986df6880f9?w=640&h=142&f=gif&s=17175);showImg(https:...
摘要:學堂碼匠本期繼續走入算法冒泡排序法。冒泡排序法完整代碼冒泡排序法的優化假如序列的數據為使用上面的冒泡排序法進行排序,得到的結果肯定沒有問題,但是,待排序的序列是有序的,理論上是無需遍歷排序。 HTML5學堂-碼匠:本期繼續走入算法 —— 冒泡排序法。冒泡排序算法相對簡單,容易上手,穩定性也比較高,算是一種較好理解的算法,也是面試官高頻提問的算法之一。 Tips:關于算法及排序的基礎知識...
閱讀 2676·2023-04-25 20:19
閱讀 1930·2021-11-24 09:38
閱讀 1632·2021-11-16 11:44
閱讀 4341·2021-09-02 15:40
閱讀 1317·2019-08-30 15:55
閱讀 2022·2019-08-30 15:52
閱讀 3759·2019-08-29 17:20
閱讀 2247·2019-08-29 13:48