【每日算法】選擇排序算法之直接選擇排序


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. 選擇排序


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM