冒泡排序
思想:
- N 個元素需要排序 N-1 趟, 每趟比較相鄰的兩個元素,如果前一個元素和後一個元素不滿足大小順序規則,則交換位置,這樣一趟下來,一趟中的最大(最小)的元素就 “沉” 到最後面的位置。
- 執行 M 趟排序後,整個元素序列中的最後面的 M 個元素就排好順序了,剩下就只需要將前面的 N-M 個元素排好序即可。
private void sortBubble(int[] arr) {
// 需要比較的趟數 N-1
for (int i = 0; i < arr.length - 1; i++) {
// 每趟中比較前面的 N-M 個相鄰的兩個元素,不滿足就交換位置,這樣最大或最小的就沉到最後面位置
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j + 1] < arr[j]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
選擇排序
思想:
- N 個元素需要排序 N-1 趟,每趟中找到最大(小)值,放在待排序序列中的第一個位置,這樣一趟下來,最大值或最小值就放在最前面。
- 執行 M 趟排序後,整個元素序列中的最前面的 M 個元素就排好順序了,剩下就只需要將後面的 N-M 個元素排好序即可
private void sortSelect(int[] arr) {
// N 個元素需要排 N-1 趟,每趟中找出最大或最小值,
for (int i = 0; i < arr.length - 1; i++) {
// 將待排序序列中第一個元素先假定爲最大(小)值
int min = i;
for (int j = i; j < arr.length - i; j++) {
// 如果一趟下來,有比第一個元素大或小元素,則將最小下標設定該下標
if (arr[j] < arr[min]) {
min = j; //重點在這,最小值下標將會被 次小值下標 替換
}
}
// 交換位置
if (min != i) {
int temp = arr[min];
arr[min] = arr[i];
arr[i] = temp;
}
}
}
插入排序
思想:
- 整個序列分爲:已經排好序的序列和待排序的序列,每趟從待排序序列中取出第一個元素,插入到已經排好序的序列合適的位置。
- 將插入位置的後面元素依次往後移動位置。
private void sortInsert(int[] arr) {
for (int i = 1; i < arr.length; i++) {
// 待排序序列的第一個元素
int temp = arr[i];
int j = i - 1;
// 待排序元素插入到已排好序序列中的合適位置
while (j > 0 && temp < arr[j]) {
arr[j + 1] = arr[j]; // 依次往後移動一個位置
j--;
}
arr[j + 1] = temp;
}
}