# 1. 簡單選擇排序
也就是每次選擇從下標`i`開始到后面的所有序列中的最小值的下標,然后將最小值下標和當前的`i`下標進行交換。也就是每次都放置到最終有序的位置。顯然時間復雜度為`O(n^2)`。代碼如下:
~~~
public void selectSort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
int min_idx = i;
for (int j = i + 1; j < arr.length; j++) {
if (arr[min_idx] > arr[j]) {
min_idx = j;
}
}
swap(arr, min_idx, i);
}
}
~~~
# 2. 堆排序
~~~
public void heapSort(int[] arr) {
for (int i = 0; i < arr.length; i++) {
heapInsert(arr, i);
}
int size = arr.length - 1;
swap(arr, size, 0);
while (size > 0) {
size--;
heapify(arr, 0, size);
swap(arr, 0, size);
}
}
private void heapify(int[] arr, int i, int size) {
int left = i * 2 + 1;
while (left < size) {
int largest = left + 1 < size && arr[left] < arr[left + 1] ? left + 1 : left;
largest = arr[i] > arr[largest] ? i : largest;
if (largest == i) {
break;
}
swap(arr, i, largest);
i = largest;
left = i * 2 + 1;
}
}
private void heapInsert(int[] arr, int index) {
while (arr[index] > arr[(index - 1) / 2]) {
swap(arr, index, (index - 1) / 2);
index = (index - 1) / 2;
}
}
~~~