[轉載] 百度百科
1、擬解決問題
輸入
n個數的序列<a1,a2,a3,...,an>。
輸出
原序列的一個重排<a1*,a2*,a3*,...,an*>;,使得a1*<=a2*<=a3*<=...<=an*
2、選擇排序的思想
1)、假定第一個元素是最小值,依次 和其它每個元素比較,最終找到最小數,用變量k記住它在數組中的位置(下標);
2)、然後進行判斷,如果這個元素的下標不是第一個元素的下標,就讓第一個元素跟他交換一下值,這樣就放置好整個數組中最小的數了。
3)、假定第二個元素是最小值,然後找到數組中第二小的數,判斷交換,就放置好整個數組中數組中第二小的數了。以此類推。
3、選擇排序的實現
/* 選擇排序 */
void select_sort(int*a,int n)
{
int i,j,min,t;
for(i=0;i<n-1;i++)
{
min=i;//查找最小值
for(j=i+1;j<n;j++)
if(a[min]>a[j])
min=j;
if(min!=i)//判斷當前元素是否是就最小值
{
t=a[min];
a[min]=a[i];
a[i]=t;
}
}
}
4、選擇排序的性能
1、時間複雜度
交換操作次數介於 0 ~ (n - 1) 。最好情況是,已經有序,交換0次;最壞情況交換n-1次;逆序要交換n/2次。
賦值操作次數是交換操作次數的3倍,介於 0 ~ 3 (n - 1) 之間。
比較操作次數次數與關鍵字的初始狀態無關,都是N=(n-1)+(n-2)+…+1=n*(n-1)/2,即滿足 O(n^2)。
2、穩定性
如果一個元素比當前元素小,而該小的元素又出現在一個和當前元素相等的元素後面,那麼交換後穩定性就被破壞了。
比較拗口,舉個例子,序列5 8 5 2 9,我們知道第一遍選擇第1個元素5會和2交換,那麼原序列中兩個5的相對前後順序就被破壞了,所以選擇排序是一個不穩定的排序算法。
和其它排序算法比較:
1)、選擇排序比冒泡排序的交換次數少多了,由於交換所需的CPU時間 比 比較所需的CPU時間多,所以選擇排序比冒泡排序快(n值較小時?還是無論n大小都是?)。
2)、堆排序類似於選擇排序。它是利用了最大堆的性質——父親要大於等於孩子的值,所以根節點是最大值,每次就選擇根節點元素放到正確的位置。