排序
選擇排序
基本思想
每一次從待排序的數據元素中選出最小(或最大)的一個元素,存放在序列的起始位置,直到全部待排序的數據元素排完。
簡單理解:每個元素都和它后面的元素比較,只要后面的元素比它大就交換
選擇排序的最終代碼
以上4個for循環代碼重復性較高,唯獨不一樣的地方就是每個for循環中都有一個使用多次的固定數字,第一個for的數
字0,第二個for的數字是1,第3個for的數字是2,第4個for的數字是3,這樣可以寫一個循環4次的for循環,假設循環循環
變量為就,只要j的取值>=0開始到<4結束,正好能獲取0,1,2,3的數字,然后把上面的任意一個for循環作為循環體,把其
中的使用多次的固定數字用j替換掉即可.
發現5個數只需要排4趟,那么n個數需要排n-1趟,如果上面的循環中的變量j的范圍固定寫成<4,對於有6,7,...個數字的
數組排序是不同用的,所以4可以使用數組的長度array.length-1 = 5-1 來表示
排序前的內容:[3, 4, 5, 6, 7]
排序后的內容:[7, 6, 5, 4, 3]
總結
1.選擇排序的原理:每個元素都和它后面的元素比較,只要后面的元素比它大就交換,掌握了這個原理,選擇排序非常簡單
2.通過畫圖分析,5個數字排4趟,n數字排n-1趟,而外層的for循環代表的是循環的趟數,所以外層循環的結束條件是array.length-1,但是寫array.length代碼也沒有問題,比如5個數字在第4趟都已經排好了,再進行第5趟排序,也不會影響程序的結果.外層循環的變量的初始值要從0開始,因為選擇排序的原理就是每個元素和它后面的所有元素比較,既然要獲取所有元素,那索引必須從0開始.
3.內層循環變量的初始值寫成int i = j+1是為了減少比較的次數,提高效率,其實寫成int i = 0,也不會影響程序運行的結果,只是多比較了很多次.但是內層循環的結束條件i<array.length,這里一定不能-1,原因很簡單,因為每個元素要和它后面的所有元素比較,既然是所有元素,那就必須能取到最后一個元素,如果寫成i<array.length-1,意味着只能取到array.length-2(是數組的倒數第二個元素,而不是最后一個元素),這樣排序結果會出現問題.
冒泡排序
基本思想
核心思想是從頭開始讓相鄰的兩個元素進行比較,符合條件就交換位置,這樣就把最大值或者最小值放到數組的最后面了;接着再從頭開始兩兩比較交換,直到把最大值或者最小值放到數組的倒數第二位。(即不需要與最后一位數進行對比).....以此類推,直到排序完成。
簡單理解: 每次都從第一個元素開始(索引0),向后兩兩比較,只要后面的比前面的大,就交換(從大到小)
冒泡排序的最終代碼
以上4個for循環代碼重復性較高,唯獨不一樣的地方就是每個for循環結束條件最后減的數字不同,第一個for循環結束條件減的數字是0,第二個for循環結束條件減的數字是1,第3個for循環結束條件減的數字是2,第4個for循環結束條件減的數字是3,這樣可以寫一個循環4次的for循環,假設循環變量為j,只要j的取值>=0開始到<4結束,正好能獲取0,1,2,3的數字,然后把上面的任意一個for循環作為循環體,把該循環體中for循環的結束條件中最后減掉的數字用j替換掉即可.發現5個數只需要排4趟,那么n個數需要排n-1趟,如果上面的循環中的變量j的范圍固定寫成<4,對於有6,7,...個數字的數組排序是不通用的,所以4可以使用數組的長度array.length-1 = 5-1 來表示
排序前的內容:[3, 4, 5, 6, 7]
排序后的內容:[7, 6, 5, 4, 3]
1.冒泡排序的原理:每次都從第一個元素開始(索引0),向后兩兩比較,只要后面的比前面的大,就交換(從大到小)
2.通過畫圖分析,5個數字排4趟,n數字排n-1趟,而外層的for循環代表的是循環的趟數,所以外層循環的結束條件是array.length-1,但是寫array.length代碼也沒有問題,比如5個數字在第4趟都已經排好了,再進行第5趟排序,也不會影響程序的結果.
3.內層循環變量的初始值寫成int i =0,是為了保證每次都從第一個元素開始(索引為0)向后兩兩比較.但是內層循環的結束條件i<array.length-1-i,這里一定要-1,原因很簡單,因為在內層循環中分表使用i和i+1作為索引獲取數組的元素,就要保證i和i+1都不能超出數組的索引范圍,即i<array.length && i+1<array.length 推導出i<array.length-1.最后的-i只是為了提高效率,因為每趟排序都會確定一個數組元素的位置,下一趟排序的時候,已經確定好位置的元素是不用繼續排序的.