1)算法簡介
選擇排序(Selection sort)是一種簡單直觀的排序算法。它的工作原理如下:
- 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置;
- 然后,再從剩余未排序元素中繼續尋找最小(大)元素,然后放到已排序序列的末尾。
- 以此類推,直到所有元素均排序完畢。
2)算法描述和分析
n個記錄的文件的直接選擇排序可經過n-1趟直接選擇排序得到有序結果:
1、初始狀態:無序區為R[1..n],有序區為空。
2、第i趟排序(i=1,2,3...n-1)
第i趟排序開始時,當前有序區和無序區分別為R[1..i-1]和R(i..n)。該趟排序從當前無序區中選出關鍵字最小的記錄 R[k],將它與無序區的第1個記錄R交換,使R[1..i]和R分別變為記錄個數增加1個的新有序區和記錄個數減少1個的新無序區。
3、前n-1趟結束,數組有序化了
選擇排序的交換操作介於0和(n-1)次之間。選擇排序的比較操作為n(n-1)/2次之間。選擇排序的賦值操作介於0和3(n-1)次之間。比較次數O(n^2),比較次數與關鍵字的初始狀態無關,總的比較次數N=(n-1)+(n-2)+...+1=n*(n-1)/2。 交換次數O(n),最好情況是,已經有序,交換0次;最壞情況是,逆序,交換n-1次。 交換次數比冒泡排序少多了,由於交換所需CPU時間比比較所需的CPU時間多,n值較小時,選擇排序比冒泡排序快。
最差時間復雜度 О(n²)
最優時間復雜度 О(n²)
平均時間復雜度 О(n²)
最差空間復雜度 О(n) total, O(1)
3)算法圖解、flash演示、視頻演示
圖解:
Flash:
http://ds.fzu.edu.cn/fine/resources/FlashContent.asp?id=85
視頻:選擇排序Select Sort排序舞蹈
http://v.youku.com/v_show/id_XMjU4NTY5NTcy.html
4)算法代碼
void selection_sort(int *a, int len)
{
register int i, j, min, t;
for(i = 0; i < len - 1; i ++)
{
min = i;
//查找最小值
for(j = i + 1; j < len; j ++)
if(a[min] > a[j])
min = j;
//交換
if(min != i)
{
t = a[min];
a[min] = a[i];
a[i] = t;
}
}
}
5)考察點,重點和頻度分析
就博主看過的筆試面試題而言,選擇算法也大多出現在選擇填空中,要熟悉其時間和空間復雜度,最好最壞的情況分別是什么,以及在那種情況下,每一輪的比較次數等。
6)筆試面試例題
例題1、在插入和選擇排序中,若初始數據基本正序,則選用 插入排序(到尾部) ;若初始數據基本反序,則選用 選擇排序 。
例題2、 下述幾種排序方法中,平均查找長度(ASL)最小的是
A. 插入排序 B.快速排序 C. 歸並排序 D. 選擇排序