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

از ویکی‌پدیا، دانشنامهٔ آزاد
پرش به: ناوبری، جستجو
مرتب‌سازی انتخابی
تجسم مرتب‌سازی انتخابی

تجسم مرتب‌سازی انتخابی
کلاس الگوریتم مرتب‌سازی
داده ساختار آرایه
بدترین زمان اجرا O(n^2)
بهترین زمان اجرا O(n^2)
زمان اجرای متوسط O(n^2)
بدترین پیچیدگی حافظه O(n) مجموع, O(1) کمکی
بهینه نه
شکل (1)
نحوهٔ عملکردمرتب سازی انتخابی

مرتب‌سازی انتخابی یکی از انواع الگوریتم مرتب‌سازی می‌باشد که جزو دستهٔ الگوریتمهای مرتب‌سازی مبتنی بر مقایسه‌است.این الگوریتم دارای پیچیدگی زمانی از درجهٔ O(n2) است که به همین دلیل اعمال آن روی مجموعهٔ بزرگی از اعداد کارا به نظرنمی رسدو به طور عمومی ضعیفتر از نوع مشابهش که مرتب‌ساز درجی است عمل می‌کند.این مرتب سازی به دلیل سادگی اش قابل توجه‌است.کارایی آن برحسب تعداد ورودیها در نمودار زیر نشان داده شده‌است. شکل (3)نمودار زمانی بر حسب تعداد ورودی

مرتب سازی انتخابی[ویرایش]

نحوه عملکرد[ویرایش]

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


ورودی: 34  15  4  12 55 24 
1) 4  15  34  12  55  24
2) 4  12  34  15  55  24
3) 4  12  15  34  55  24
4) 4  12  15  24  55  34
5) 4  12  15  24  34  55 

الگوریتم[ویرایش]

الگوریتم در جاوا

void selectionSort(int[] a) {
    for (int i = 0; i <a.length - 1; i++) {
        int min = i;
        for (int j = i + 1; j <a.length; j++) {
            if (a[j] <a[min]) {
                min = j;
            }
        }
        int swap = a[i];
        a[i] = a[min];
        a[min] = swap;
    }
}

الگوریتم درC++

#include <iostream.h>

void selectionSort(int *array,int length)//selection sort function 
{
        int i,j,min,minat;
        for(i=0;i<(length-1);i++)
        {
                minat=i;
                min=array[i];

      for(j=i+1;j<(length);j++) //select the min of the rest of array
          {
                  if(min>array[j])   //ascending order for descending reverse
                  {
                          minat=j;  //the position of the min element 
                          min=array[j];
                  }
          }
          int temp=array[i] ;
          array[i]=array[minat];  //swap 
          array[minat]=temp;

                
        }

}

void printElements(int *array,int length) //print array elements
{
        int i=0;
        for(i=0;i<10;i++)
    cout<<array[i]<<endl;
}

void main()
{

        int a[]={9,6,5,23,2,6,2,7,1,8};   // array to sort 
    selectionSort(a,10);                 //call to selection sort  
        printElements(a,10);               // print elements 
}

تحلیل مرتبه الگوریتم[ویرایش]

تحلیل الگوریتم مرتب‌سازی انتخابی برخلاف بسیاری از مرتب‌سازیهای دیگر بسیار ساده‌است.زیراکه هیچ کدام از حلقه‌های آن به اعداد موجود در لیست ورودی بستگی ندارد.در مرحلهٔ اول به دست آوردن کمینه در لیست n عنصری نیاز به پیمودن کل n عددو n – 1 مقایسه دارد وسپس باید کمینهٔ بدست آمده با اولین عدد جابجا شود.در مرحلهٔ بعدی به دست آوردن دومین کمینه در لیست 1 - n عنصری نیاز به پیمودن کل 1 - n عددو 2 - n مقایسه دارد و کمینهٔ بدست آمده بادومین عدد جابجا شودو این روند ادامه پیدا می‌کند.پس کلاً تعداد مقایسه‌ها عبارتست از:

(n − 1) + (n − 2) +... + 2 + 1 = n(n − 1) / 2 ∈ Θ(n2)

مرتبهٔ این الگوریتم به دلیل عدم وابستگی آن به نحوهٔ ترتیب اعداد در بهترین، بدترین و حالت متوسط یکسان و برابر(Θ(n2

است.

ویژگی‌های مرتب‌سازی انتخابی[ویرایش]

1-با توجه به قطعه کد نوشته شده، ترتیب عناصر تغییری در عملکرد آن اینجا نمی‌کند. یعنی این الگوریتم برای داده‌های کاملاً مرتب، نامرتب تصادفی و مرتب معکوس به یک ترتیب عمل کرده و تمام مقایسه‌های محاسبه شده در رابطه فوق را انجام می‌دهد. بنابراین پیچیدگی این الگوریتم در بهترین حالت و حالت متوسط نیز ( Θ( n2 است. 2- مرتب‌سازی انتخابی یک روش مرتب‌سازی درجا است. یعنی عملیات مرتب‌سازی در داخل خود لیست و بدون نیاز به حافظه کمکی بزرگ انجام می‌گیرد. 3- در پیاده‌سازی مرتب‌سازی انتخابی به روش فوق، اگر دو عنصر با مقدار بیشینه داشته باشیم، اولی انتخاب شده و به انتهای لیست منتقل می‌شود. در نتیجه ترتیب آنها به هم می‌خورد. بنابراین این پیاده‌سازی روش پایدار نیست. در روش پایدار ترتیب عناصر با مقدار یکسان تغییر نمی‌کند. اما اگر در مقایسه عناصر آرایه به جای> از => استفاده کنید، مرتب‌سازی پایدار خواهد شد.

مقایسه با سایر الگوریتمهای مرتب سازی[ویرایش]

این الگوریتم بین الگوریتمهای با مرتبهٔ مرتب‌سازانتخابی از مرتب‌ساز حبابی و مرتب ساز گورزاد (در حالت متوسط)بهتر عمل می‌کند.اما عموماً ضعیفتر ازمرتب‌ساز درجی است.یکی از شباهتهای مرتب‌ساز درجی به مرتب ساز انتخابی این است که در هر دوپس از پیمایش Kام مجموعه اعداد kعنصر اول در جای صحیح خود قرار گرفته‌اند.فایدهٔ مرتب‌ساز درجی این است که برای پیدا کردن عنصر x هر تعداد از اعداد را که نیاز است بررسی می‌کند.حال آنکه مرتب سازانتخابی همه عناصر باقی‌مانده را بررسی می‌کند. به هر حال هر دو آنها روی لیستهای کوچک بسیار سریع هستند. در نهایت اعمال مرتب ساز انتخابی روی لیستهایی با اندازه بزرگ به مراتب از مرتب‌ساز حبابی که روی ان لیستها با پیچیدگی زمانی (Θ(n log n عمل می‌کندضعیفتر است.

سورس مرتب سازی انتخابی ( Selection sort )[ویرایش]

مثال[ویرایش]

این سورس یک عدد گرفته و به تعداد همان عدد از ورودی دریافت می کند و آنها را با روش . Selection sort مرتب می کند .

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>

//----
void read_list(int a[],int n){
 int i;
 for(i=0;i<n;i++){
  printf("\n\n\t ENTER THE ELEMENT [%d] :: ",i);
  scanf("%d",&a[i]);
  }
}
//----
void print_list(int a[],int n){
 int i;
 for(i=0;i<n;i++)
  printf("\t%d",a[i]);
}
//----
void select_sort(int a[],int n){
 int i,j,temp,min;
 for(i=0;i<n;i++){
  min=i;
  for(j=i+1;j<n;j++)
   if(a[min]>a[j])
  min=j;
  temp=a[i];
  a[i]=a[min];
  a[min]=temp;
  printf("\n\n\t PASS %d :: ",i);
  print_list(a,n);
 }
}
//----
void main(){
 int a[20],n;
 clrscr();
 printf("\n\n\t ENTER THE ARRAY LENGTH :: ");
 scanf("%d",&n);
 read_list(a,n);
 printf("\n\n\t THE ARRAY ELEMENTS ARE AS FOLLOWS :: ");
 print_list(a,n);
 select_sort(a,n);
 printf("\n\n\t THE SORTED LIST IS :: ");
 print_list(a,n);
 getch();
}
//----

جستارهای وابسته[ویرایش]

الگوریتم‌های مرتب‌سازی

منابع[ویرایش]

پیوند به بیرون[ویرایش]