槓上數據結構 - 排序
- 穩定:如果a原本在b前面,而a=b,排序之後a仍然在b的前面。
- 不穩定:如果a原本在b的前面,而a=b,排序之後 a 可能會出現在 b 的後面。
- 時間複雜度:對排序數據的總的操作次數。反映當n變化時,操作次數呈現什麼規律。
- 空間複雜度:是指算法在計算機
冒泡排序
每次 比較相鄰 的兩個元素,後一個元素值小於前一個元素值(升序),則交互位置,n 個元素需要比較 n-1 趟,每一趟需要比較 (n-當前第幾趟) 次。
如數組 {23, 1, 98,4,18,3 }
第一趟:
第一次比較:23 > 1 交換位置: 1, 23, 98, 4, 18, 3
第二次比較:23 < 98 位置不變: 1, 23, 98, 4, 18, 3
第三次比較:98 > 4 交換位置: 1, 23, 4, 98,18, 3
第四次比較:98 > 18 交換位置: 1, 23, 4,18, 98,3
第五次比較:98 > 3 交換位置: 1, 23, 4,18, 3,98
第一趟比較完,最大的元素下移到最後位置。
第二趟:
第一次比較:1 < 23 位置不變: 1, 23, 4,18, 3,98
第二次比較:23 > 4 交換位置: 1, 4,23, 18, 3,98
第三次比較:23 > 18 交換位置: 1, 4, 18,23, 3,98
第四次比較:23 > 3 交換位置: 1, 4, 18,3, 23,98
第二趟比較完,最大的兩個元素排到了最後兩個位置上了。
第三趟:
第一次比較:1 < 4 位置不變: 1, 4, 18,3, 23,98
第二次比較:4 > 18 位置不變: 1, 4, 18,3, 23,98
第三次比較:18 > 3 交換位置: 1, 4, 3,18, 23,98
第三趟比較完,最大的三個元素排到了最後三個位置上了。
第四趟:
第一次比較:1 < 4 位置不變: 1, 4, 3,18, 23,98
第二次比較:4 > 3 交換位置: 1, 3, 4,18, 23,98
第四趟比較完,最大的四個元素排到了最後四個位置上了。
第五趟:
第一次比較:1 < 3 位置不變:1, 3, 4,18, 23,98
第五趟比較完,最大的五個元素排到了最後五個位置上了。
常規寫法
private void bubbleSort(int[] array) {
for(int i = 0; i < array.length - 1; i++) {
System.out.println("第 " + i + " 趟");
for(int j = 0; j < array.length - i - 1;j++) {
if(array[j] > array[j+1]) {
int temp = array[j+1];
array[j+1] = array[j];
array[j] = temp;
}
}
}
print(array);
}
bubbleSort(new int[]{1,2,3,4,5,6,9,8});
"第 0 趟" :
"第 1 趟" :
"第 2 趟" :
"第 3 趟" :
"第 4 趟" :
"第 5 趟" :
"第 6 趟" :
[1, 2, 3, 4, 5, 6, 8, 9]
優化一: 標誌位減少比較趟數
條件: 假如有序列 {1, 2, 3, 4, 5, 6, 7, 8, 10, 9} , 第一趟排序將 10 和 9 交換位置,此時序列爲 {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} 已經有序,接下來的 8 趟排序就是多餘的,什麼也沒做。所以我們可以加一個標誌位,如果某一趟中沒有交換過元素,則說明此時已經有序了,不用再比較剩下的趟數。
private void bubbleSort(int[] array) {
for(int i = 0; i < array.length - 1; i++) {
System.out.println("第 : " + i + " 趟 ");
// 標記這一趟中,有沒有元素交換位置,如果這一趟中沒有元素交換位置,則說明此時已經有序了,後面的 n-i-1 趟就不需要再走了。
boolean changed = false;
for(int j = 0; j < array.length - i - 1;j++) {
if(array[j] > array[j+1]) {
int temp = array[j+1];
array[j+1] = array[j];
array[j] = temp;
changed = true;
}
}
if(!changed) {
break;
}
}
print(array);
}
// 調用
bubbleSort(new int[]{1,2,3,4,5,6,9,8});
第 0 趟
第 1 趟
[1, 2, 3, 4, 5, 6, 8, 9]
選擇排序
private void sortSelect(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
int min = i;
for (int j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[min]) {
min = j;
}
}
if (min != i) {
int temp = arr[i];
arr[i] = arr[min];
arr[min] = temp;
}
}
System.out.println(Arrays.toString(arr));
}