選擇排序
選擇排序是一種簡單直觀的排序算法,無論什麼數據都是O(n^2)的時間複雜度。所以用到它的時候,數據規模越小越好。
算法步驟
- 從數組中找出最小的那個元素,然後與最開始的元素交換位置
- 忽略第一步中找到的最小元素,重複執行步驟1
動圖演示
算法實現
for (int i = 0; i < array.length - 1; i++) {
int minIndex = i; // 保存最小元素索引
for (int j = i; j < array.length; j++) {
if(cmp(minIndex, j) > 0) {
minIndex = j;
}
}
swap(i, minIndex); // 將最小元素交換到開始位置
}
也可以挑選出最大元素,與最後的元素的交換,實現代碼如下:
for (int end = array.length - 1; end > 0; end--) {
int maxIndex = 0; // 記錄最大索引
for (int begin = 1; begin <= end; begin++) {
if (cmp(maxIndex, begin) <= 0) {
maxIndex = begin;
}
}
swap(maxIndex, end); // 將最大元素交換到最後位置
}
選擇排序的交換次數要遠遠少於冒泡排序,平均性能優於冒泡排序。
最好、最壞、平均時間複雜度:O(n^2)。
空間複雜度:O(1)。
選擇排序是一個不穩定的排序算法,看下面的例子:
- 排序前:
5* 5 1 7
- 排序後:
1 5 5* 7
算法優化
選擇排序每次循環中都需要找出最小(大)的元素與開始(最後)位置的元素進行交換,可以使用大頂堆來實現查找最大元素,可以將查找元素的時間複雜度由O(n)降低爲O(logn),其實就是堆排序。
更多精彩內容關注本人公衆號:架構師升級之路