排序算法——選擇排序(selection sort)

選擇排序(Selection sort)是一種簡單直觀的排序算法。它的工作原理是每一次從待排序的數(shù)據(jù)元素中選出最小(或最大)的一個元素,存放在序列的起始位置,直到全部待排序的數(shù)據(jù)元素排完。 選擇排序是不穩(wěn)定的排序方法(比如序列[5, 5, 3]第一次就將第一個[5]與[3]交換,導致第一個5挪動到第二個5后面)。
性質(zhì):不穩(wěn)定的排序方法


示例代碼:

#include <stdio.h>

void select_sort(int a[], int n)
{
    for(int i=0; i < n-1; i++)
    {
        int pos = i;
        for(int j=i+1; j<n; j++)
        {
            // 找到最小值的那個元素的下標
            if(a[j] < a[pos])
            {
                pos = j;
            }
        }
        // 把最小值調(diào)換到最前面
        if(pos != i)
        {
            int temp = a[pos];
            a[pos] = a[i];
            a[i] = temp;
        }
    }
}

int main()
{
    int a[5] = { 6, 8, 7, 4, 5};
    int n = 5;
    
    int b[4] = { 1, 9, 2, 6};
    select_sort(b, 4);
    return 0;
}


  • 用戶自定義類型的排序

#include <stdio.h>
#include <string.h>

struct Student
{
    int id;
    char name[32];
};

void select_sort(Student a[], int n) // 1: 參數(shù)類型
{
    for(int i=0; i < n-1; i++)
    {
        int pos = i;
        for(int j=i+1; j<n; j++)
        {
            // 找到最小值的那個元素的下標
            //if(a[j].id < a[pos].id) // 3. 比較大小的方法
            if( strcmp (a[j].name ,a[pos].name) < 0)
            {
                pos = j;
            }
        }
        // 把最小值調(diào)換到最前面
        if(pos != i)
        {
            Student temp = a[pos]; // 2. 元素類型
            a[pos] = a[i];
            a[i] = temp;
        }
    }
}

int main()
{
    Student a[4];
    a[0].id = 4;
    strcpy(a[0].name, "shaofa");

    a[1].id = 7;
    strcpy(a[1].name, "anxin");

    a[2].id = 2;
    strcpy(a[2].name, "jennifer");

    a[3].id = 5;
    strcpy(a[3].name, "other");

    select_sort(a, 4);
    return 0;
}

1.時間復雜度

排序算法復雜度對比 lgn = log2n
選擇排序的交換操作介于 0 和 (n - 1) 次之間。選擇排序的比較操作為 n (n - 1) / 2 次之間。選擇排序的賦值操作介于 0 和 3 (n - 1) 次之間。
比較次數(shù)O(n^2),比較次數(shù)與關(guān)鍵字的初始狀態(tài)無關(guān),總的比較次數(shù)N=(n-1)+(n-2)+...+1=n*(n-1)/2。交換次數(shù)O(n),最好情況是,已經(jīng)有序,交換0次;最壞情況交換n-1次,逆序交換n/2次。交換次數(shù)比冒泡排序少多了,由于交換所需CPU時間比比較所需的CPU時間多,n值較小時,選擇排序比冒泡排序快。
其他排序算法的復雜度如右圖所示。


2.穩(wěn)定性


選擇排序是給每個位置選擇當前元素最小的,比如給第一個位置選擇最小的,在剩余元素里面給第二個元素選擇第二小的,依次類推,直到第n-1個元素,第n個元素不用選擇了,因為只剩下它一個最大的元素了。那么,在一趟選擇,如果一個元素比當前元素小,而該小的元素又出現(xiàn)在一個和當前元素相等的元素后面,那么交換后穩(wěn)定性就被破壞了。比較拗口,舉個例子,序列5 8 5 2 9,我們知道第一遍選擇第1個元素5會和2交換,那么原序列中兩個5的相對前后順序就被破壞了,所以選擇排序是一個不穩(wěn)定的排序算法。

??


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容

  • 概述 排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    蟻前閱讀 5,214評論 0 52
  • 概述:排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    每天刷兩次牙閱讀 3,742評論 0 15
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 將一個記錄插入到已排序好...
    依依玖玥閱讀 1,270評論 0 2
  • 排序的基本概念 在計算機程序開發(fā)過程中,經(jīng)常需要一組數(shù)據(jù)元素(或記錄)按某個關(guān)鍵字進行排序,排序完成的序列可用于快...
    Jack921閱讀 1,458評論 1 4
  • 從藝術(shù)骨干培訓看瓊中教師精神 ——記2017年瓊中黎族苗族自治縣中小學校藝術(shù)類骨干教師培訓班 2017年7月10-...
    一只會飛的山羊閱讀 3,371評論 5 4