選擇排序的基本思想:
每一趟在數個記錄裏選取關鍵字最小的記錄作爲有序序列的第i個記錄。實現代碼如下:
void SelectSort(int a[], int n)
{
int k, temp;
for (int i =0 ; i < n - 1; ++i)
{
k = i;
for (int j = i + 1; j < n; ++j)
{
if (a[k] > a[j])
{
k = j;
}
}
if (k != i)
{
temp = a[i];
a[i] = a[k];
a[k] = temp;
}
}
}
從簡單排序的實現過程來看,與冒泡算法相比,最大的特點就是移動數據次數相當少。
時間複雜度:
無論是最差還是最好的情況,選擇排序比較的次數都一樣多,第i趟需要比較n-i次,總共需要比較n-1+n-2+...+1 = n(n-1)/2次。最好的情況時交換的次數爲0,最差的時候,交換的次數爲n-1次,基於最終的交換次數和比較次數,因此總的時間複雜度爲O(n^2)。儘管與冒泡排序同樣的時間複雜度,但是簡單選擇排序的性能還是略優於冒泡排序。
穩定性:
選擇排序在每一趟中選擇最小的數據與第一個位置的數據交換,以此類推,直到n-1個元素,如果在某一趟中,若有一個元素比當前元素小,而此時在該元素的前面又有一個和當前元素相等的元素,交換完成後,序列的穩定性就被破壞了。比如,有序列5,4,5,3,6在第一趟結束後,第一個位置的5會和3交換,那麼原序列中的兩個5的相對前後順序就被破壞了,因此簡單選擇排序是一個不穩定的排序算法。