摘要:外層循環讓內層循環繼續排沒有排序過的數組,排序過的不用再排。那么優化后的算法能快多少呢。我們都以數組長度為來計算傳統冒泡排序步,優化后的冒泡排序步。因為優化后的冒泡排序,每排完一次,最后一個數已經是最大的,就不需要再比較了。
冒泡排序的時間用大O表示法是O(N^2).
傳統的冒泡排序:
/** * @param total 要排序的數組長度 */ public void sort(int total){ int num[]; if(total <= 0){ System.out.println("請輸入大于0的正整數"); }else{ num = new int[total]; for (int i = 0 ; i < total; i++){ //生成隨機1到100之間的數 Random ra =new Random(); num[i] = ra.nextInt(100)+1; } System.out.println("要排序的數組為:" + Arrays.toString(num)); int sum = 0; int out,in; for (out = total - 1; out > 1; out--){ for (in = 0 ; in < out; in++){ sum ++; if(num[in] > num[in+1]){ int temp = num[in]; num[in] = num[in+1]; num[in+1] = temp; } } } // 最原始的冒泡排序 for(int i = 0; i < total -1 ; i ++){ for (int j = 0 ; j < total -1 ; j++){ sum ++; if(num[j] > num[j+1]){ int temp = num[j]; num[j] = num[j+1]; num[j+1] = temp; } } } System.out.println("排序完成的數組為:" + Arrays.toString(num)); System.out.println("總共用次數:" + sum); } }
優化過后的冒泡排序:
/** * @param total 要排序的數組長度 */ public void sort(int total){ int num[]; if(total <= 0){ System.out.println("請輸入大于0的正整數"); }else{ num = new int[total]; for (int i = 0 ; i < total; i++){ //生成隨機1到100之間的數 Random ra =new Random(); num[i] = ra.nextInt(100)+1; } System.out.println("要排序的數組為:" + Arrays.toString(num)); /**核心算法: * 雙重循環,外層循環用于控制排多少次序。 * 內層循環從第一位開始一直往后比較,內層循環一次后,可以將最大的數至于末尾。 * 外層循環讓內層循環繼續排沒有排序過的數組,排序過的不用再排。 */ int sum = 0; int out,in; for (out = total - 1; out > 1; out--){ for (in = 0 ; in < out; in++){ sum ++; if(num[in] > num[in+1]){ int temp = num[in]; num[in] = num[in+1]; num[in+1] = temp; } } } System.out.println("排序完成的數組為:" + Arrays.toString(num)); System.out.println("總共用次數:" + sum); } }
大家對比可以發現,就是外層循環的時候有點變化,其他的代碼都是一模一樣的。
那么優化后的算法能快多少呢。我們都以數組長度為10來計算:
傳統冒泡排序:9x9=81步,
優化后的冒泡排序:9+8+7+6+5+4+3+2=44步。
因為優化后的冒泡排序,每排完一次,最后一個數已經是最大的,就不需要再比較了。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/73305.html
摘要:二分查找法要查找的數數組長度設定的數組花了多少次找到最小值最大值當前猜的值打印猜的每個數找到了花了次如果猜的數大于選定的數,則把設為猜的數,否則把設為猜的數請輸入大于等于的正整數且查找的數不能大于數組里最大的數調用方法執行結果找到了花了次 大O表示法使用大寫字母O,可以認為其含義為order of(大約是)。我們可以使用大O法來描述線性查找使用了O(N)級時間,二分查找使用了O(log...
摘要:多練練排序算法,不僅能夠讓我們知道一些排序方法的底層實現細節,更能夠鍛煉我們的思維,提升編程能力。排序算法的穩定性一個穩定的排序,指的是在排序之后,相同元素的前后順序不會被改變,反之就稱為不穩定。 1. 導言 因為這是排序算法系列的第一篇文章,所以多啰嗦幾句。 排序是很常見的算法之一,現在很多編程語言都集成了一些排序算法,比如Java 的Arrays.sort()方法,這種方式讓我們可...
摘要:插入排序特殊從第二個元素開始,和第一個元素比較,如果滿足排序的順序,則交換順序。優化后選擇排序從第一個位置開始遍歷待排序的元素,找到最小值和第一元素交換從位置開始往后遍歷,找到之后元素中的最小值,和第個元素交換位置。 插入排序1、特殊:從第二個元素開始,和第一個元素比較,如果滿足排序的順序,則交換順序。2、一般:把待比較和他之前的所有元素相比(從右往左),如果滿足排序的順序,這交換。 ...
閱讀 2137·2023-04-25 18:49
閱讀 1840·2019-08-30 14:02
閱讀 2643·2019-08-29 17:24
閱讀 3323·2019-08-28 18:10
閱讀 2926·2019-08-28 18:03
閱讀 488·2019-08-26 12:01
閱讀 3309·2019-08-26 11:31
閱讀 1409·2019-08-26 10:29