算法回顧之選擇排序

算法回顧之簡單選擇排序

概述

選擇排序分爲簡單選擇排序和堆排序,可以說,簡單選擇排序是最簡單的排序算法之一,它十分直觀,易懂,但同時,它也是能力十分強大 的堆排序的基礎。


思路

簡單選擇排序的思路十分簡單,大致如下:

每次從未排序序列中找到權值最大(最小)的項,把它放到未排序序列的最前面,或者說已排序序列的最後面,即和未排序的第一個元素互換。重複執行,知道整個序列有序。

以從小到大排序爲例,考慮下面這個序列:

2 8 7 9 3 6 1

一共七個數

第一趟: 找到最小的數1 ,把它和無序序列的首個互換,構成序列 1 | 8 7 9 3 6 2

(|分割已排序和未排序序列,後面相同)

第二趟: 最小的數2,和8互換,此時序列爲 1 2 | 7 9 3 6 8

第三趟: 找到最小的數3,和7互換,變成 1 2 3 | 9 7 6 8

第四趟: 找到最小的數6,和9互換,變成 1 2 3 6 | 7 9 8

第五趟: 找到最小的數7,無需變動,變成 1 2 3 6 7 | 9 8

第六趟:找到最小的數8,和9互換,變成 1 2 3 6 7 8 | 9

此時已經有序


實現

選擇排序比較簡單,直接上代碼

#include<iostream>
#define MAXN 100
using namespace std;
void Selectsort(int a[],int n)
{
    int i,j;
    for(i=1;i<n;i++)
    {
        int minn=i;
        for(j=i+1;j<=n;j++)
            //找到無序序列中的最小值
            if(a[j]<a[minn]) minn=j;
        //如果最小值和無序序列的第一個元素不等,則互換
        if(minn!=i) {a[0]=a[i];a[i]=a[minn];a[minn]=a[0];}
    }
}
int main()
{
    int n,a[MAXN];
    int i;
    cin>>n;
    for(i=1;i<=n;i++)
    cin>>a[i];
    Selectsort(a,n);
    for(i=1;i<=n;i++)
    cout<<a[i]<<" ";
    return 0;
}


複雜度分析

空間複雜度

數組首位放空,作爲保存最小值的中介。

空間複雜度爲 O(1)

時間複雜度

最好情況和最壞情況均要比較 n1i=1ni

最好情況,移動次數爲 0

最壞情況,移動3×(n1)

時間複雜度爲O(n2)

Tip:還有另一種選擇排序,堆排序

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章