算法思想
選擇排序 是一種簡單直觀的排序算法,它的工作原理是:第一次從待排序的數據元素中選出最小(或最大)的一個元素,存放在序列的起始位置,然後再從剩餘的未排序元素中尋找到最小(大)元素,然後放到已排序的序列的末尾。以此類推,直到全部待排序的數據元素的個數爲零。選擇排序是不穩定的排序方法。
時間複雜度
選擇排序 需要從頭到尾遍歷所有元素來進行對比,因此其時間複雜度爲:
適用場景
由選擇排序的時間複雜度可知,該排序算法適用於數據規模越小越好。
對比冒泡排序
選擇排序 和 冒泡排序 的時間複雜度都是 ,那麼它們之間的區別是什麼呢?其實兩者的算法思想很相似,都是對比並交換位置,但是前者是每輪找到最小值然後再與第一個元素進行交換位置,而後者是兩兩對比並立即交換位置,也就是說同一數據集的情況下,選擇排序要比冒泡排序減少了交換次數。
算法步驟
1、首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置;
2、再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾;
3、重複第二步,直到所有元素均排序完畢。
動圖演示
代碼實現
JavaScript實現
function selectionSort(arr) {
var len = arr.length;
var minIndex, temp;
//需要經過N-1輪對比
for (var i = 0; i < len - 1; i++) {
minIndex = i; //最小值的索引
for (var j = i + 1; j < len; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j; //找到最小值並更新其索引
}
}
temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
return arr;
}
Python實現
def selectionSort(arr):
for i in range(len(arr)):
min_index = i # 最小值索引
for j in range(i + 1, len(arr)):
if arr[j] < arr[min_index]:
min_index = j
if i != min_index:
arr[i], arr[min_index] = arr[min_index], arr[i]
return arr
Java實現
public int[] selectionSort(int[] sourceArray) {
//複製源數組
int[] arr = Arrays.copyOf(sourceArray,sourceArray.length);
//總共需要經過N-1輪比較
for(int i = 0; i < arr.length - 1; i++) {
//最小值的索引
int minIndex = i;
//每輪循環需要 N-i次對比
for (int j = i + 1; j < arr.length; j++) {
//找到本輪的最小值,並更新其索引
if (arr[j] < arr[minIndex]) {
minIndex = j;
}
}
//找到最小值和i位置所在的值進行交換
if (i != minIndex) {
int temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
}
return arr;
}