數組排序 目錄 一. 冒泡排序 二. 選擇排序 三. 優化選擇排序 一. 冒泡排序 將數組元素按【從小到大排序】為例 思路:依次對臨近的兩個元素對比,將最大值放在數組最後;再將剩餘的元素對比,大值放在剩餘元素的最後. . . 以此迴圈,最後元素就是按從小到大排列。 1.1. 做之前,先瞭解這個操作: ...
數組排序
目錄
一. 冒泡排序
二. 選擇排序
三. 優化選擇排序
一. 冒泡排序
將數組元素按【從小到大排序】為例
思路:依次對臨近的兩個元素對比,將最大值放在數組最後;再將剩餘的元素對比,大值放在剩餘元素的最後. . . 以此迴圈,最後元素就是按從小到大排列。
1.1. 做之前,先瞭解這個操作:把數組的最大值放在末尾
將元素1和元素2對比,如果元素1的值大,則元素2和元素1的值互換(此時元素2為大值);再讓元素2和元素3對比. . ( 保留大值). . 元素3和元素4對比 . . . 依次類推,對比完全部的元素後(因是按照當前元素和下一個元素進行的對比,所以當前元素為倒數第二個元素時,就可完成全部的元素對比,也就是對比了【數組長度-1次】),則最後的元素就是最大值;
1 for (int i = 0; i < arr.length - 1; i++) {
2 //若當前元素比下一個元素大,則將這兩個元素互換
3 if(arr[i] > arr[i+1]){
4 int temp = arr[i];
5 arr[i] = arr[i+1];
6 arr[i+1] = temp;
7 }
1.2. 【1.1】的基礎上,將其餘的元素按照從小到大迴圈排序:
使用【1.1】的方法,將剩下的元素再進行最大值的對比(對比的次數比【1.1】的少一次,就可進行剩餘元素的對比);按此思路迴圈即可(迴圈一次,大值就放在【迴圈元素的】後面;當迴圈到第二個元素時,第一個元素就是最小值,也就是迴圈了【數組長度-1次】)。
1 int[] arr = {1,3,5,1,2,7,9};
2 //2、迴圈一次,就將一個大值放在數組後面;當迴圈到第二個元素時,第一個元素就已經是最小值,故迴圈【數組長度 - 1次】即可。
3 for(int j = 0 ;j < arr.length - 1 ;j++){
4 for (int i = 0; i < arr.length - 1 - j; i++) {
5 //1、若當前元素比下一個元素大,則將這兩個元素互換
6 if(arr[i] > arr[i+1]){
7 int temp = arr[i];
8 arr[i] = arr[i+1];
9 arr[i+1] = temp;
10 }
11 }
12 }
13 for (int i = 0; i < arr.length; i++) {
14 System.out.print(arr[i]+" ");
15 }
二. 選擇排序法
將數組元素按【從小到大排序】為例
思路:將第一個元素與之後的元素對比,若有值比其大的元素,則將這兩個元素互換(保證第一個元素為最小值);然後第二個元素與之後的元素對比 . . . 依次迴圈。
2.1. 做之前,先瞭解這個操作:將數組的最小值放在最前面
思路:將第一個元素,與之和的元素挨個對比,期間若有值比其大的元素,則將這兩個元素互換(迴圈到【數組長度-1次】後,則完成所有元素的對比)。
for (int i = 0; i < arr.length - 1; i++) {
//如果第一個元素比之後的元素大,則和其元素互換,迴圈完畢後,arr[0]是數組的最小值。
if(arr[0] > arr[i+1]){
int temp = arr[0];
arr[0] = arr[i + 1];
arr[i + 1] = temp;
}
}
2.2. 【2.1】 的基礎上,將其餘的元素按照從小到大迴圈排序:
使用【2.1】的(內部)迴圈後,再將第二個元素與之後的所有元素進行對比(因是第二元素個開始,故迴圈的次數比【2.1】少一次),按此思路(外部)迴圈即可(每次迴圈對比的次數,都比上一次少一次)
分析1:(外部)迴圈第一次,用第一個元素和其他元素對比;迴圈第二次,用第二個元素與其他元素對比 . . . 故(外部)迴圈的次數【i】與做對比的元素索引符合【arr[i]】
分析2:(內部)迴圈對比的次數,每次比上次少一次,將外部迴圈的次數【i】,符合內部迴圈的迴圈初始值。
1 int[] arr = {1,3,5,1,2,7,9};
2
3 for (int j = 0; j < arr.length; j++) {
4 //2、因每完成一次迴圈,下次迴圈次數需要少一次;外部迴圈的值給內部迴圈,可達到該效果
5 for (int i = j; i < arr.length - 1; i++) {
6 //1、如果第一個元素比之後的元素大,則和其元素互換,迴圈完畢後,arr[j]是其在內與之後元素中的的最小值。
7 if(arr[j] > arr[i+1]){
8 int temp = arr[j];
9 arr[j] = arr[i + 1];
10 arr[i + 1] = temp;
11 }
12 }
13 }
三. 優化選擇排序法
將數組元素按【從小到大排序】為例
因選擇排序法需要進行某元素與之後所有的元素對比,併進行元素互換的過程,若數組的長度很長,則元素互換需要耗費較多資源
優化思路:再選擇排序法的基礎上,設置變數index(代表起點對比元素的索引),和變數value(代表起點元素的值),當出現比其值小的元素時,將該元素的值和索引賦值給變數(賦值耗費的資源大大低於元素互換);然後將代表最小值的變數索引與起點元素索引對比,若不相同,則將起點元素與最小值元素互換(這樣迴圈下去,以較少的元素互換次數,即可完成排序)。
1 for (int i = 0; i < arr.length - 1; i++) {
2 int index = i;
3 int value = arr[i];
4 //若出現比起點元素值更好的元素,將該元素的索引和值賦給起點元素變數。
5 for (int j = i + 1; j < arr.length; j++) {
6 if (value > arr[j]) {
7 value = arr[j];
8 index = j;
9 }
10 }
11 //若最小值的索引(index)與起點索引不同,則將最小值的元素和起點元素互換
12 if (i != index) {
13 int temp = arr[i];
14 arr[i] = arr[index];
15 arr[index] = temp;
16 }
17 }