مرتب سازی انتخابی

تعریف

مرتب‌سازی انتخابی (Selection Sort) یک نوع الگوریتم مرتب‌سازی می‌باشد که جزء دسته‌ی الگوریتم‌های مرتب‌سازی مبتنی بر مقایسه‌است.

الگوریتم

ابتدا کوچک‌ترین عنصر مجموعه اعداد را یافته و با اولین عدد جابه‌جا می‌کنیم. سپس دومین عنصر کوچک‌تر را یافته و با دومین عدد جابه‌جا می‌کنیم و این روند را برای $n - 1$ عدد اول تکرار می‌کنیم. در حقیقت در هر مرحله ما لیست خود را به دو بخش تقسیم می‌کنیم. زیر لیست اول که قبلاً مرتب کرده‌ایم و سایر اعضای لیست که هنوز مرتب نشده‌است. در زیر مثالی از پیاده‌سازی این روال بر روی $5$ عدد آمده‌است.

$$[55 ,24 ,36 ,11 ,7]$$

$$[7 ,24 ,36 ,11 ,55]$$

$$[7 ,11 ,36 ,24 ,55]$$

$$[7 ,11 ,24 ,36 ,55]$$

$$[7 ,11 ,24 ,36 ,55]$$

پیچیدگی‌ الگوریتم

این الگوریتم دارای پیچیدگی زمانی از مرتبه‌ی $\mathcal{O}(n^2)$ است که به همین دلیل اعمال آن روی مجموعه‌ی بزرگی از اعداد کارا به نظر نمی‌رسد و به طور عمومی ضعیف‌تر از مرتب سازی‌های مشابه مثل مرتب سازی درجی عمل می‌کند. این مرتب سازی به دلیل سادگی‌اش قابل توجه‌است. در بهترین حالت از $\mathcal{O}(n^2)$ است.

پیاده‌سازی اولیه

Selection_Sort.cpp
#include <iostream>
#include <algorithm>
using namespace std;
 
const int maxn=1000+100;
int n,a[maxn];
 
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    for(int i=1;i<=n-1;i++){
        int imin=i;
        for(int j=i+1;j<=n;j++)
            if(a[j]<a[imin])
                imin=j;
        swap(a[i],a[imin]);
    }
    for(int i=1;i<=n;i++)
        cout<<a[i]<<" ";
    cout<<endl;
 
    return 0;
}