مرتبسازی انتخابی
مرتبسازی انتخابی یکی از انواع الگوریتم مرتبسازی میباشد که جزو دستهٔ الگوریتمهای مرتبسازی مبتنی بر مقایسهاست.این الگوریتم دارای پیچیدگی زمانی از درجهٔ (O(n2 است که به همین دلیل اعمال آن روی مجموعهٔ بزرگی از اعداد کارا به نظرنمی رسدو به طور عمومی ضعیفتر از نوع مشابهش که مرتبساز درجی است عمل میکند.این مرتب سازی به دلیل سادگی اش قابل توجهاست.کارایی آن برحسب تعداد ورودیها در نمودار زیر نشان داده شدهاست. 
محتویات |
مرتب سازی انتخابی [ویرایش]
نحوه عملکرد [ویرایش]
این الگوریتم اینگونه عمل میکند: ابتدا کوچکترین عنصر مجموعه اعداد را یافته با اولین عدد جابجا می کنیم.سپس دومین عنصر کوچکتر را یافته با دومین عدد جابجا می کنیم و این روند را برای 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();
}
//----
جستارهای وابسته [ویرایش]
منابع [ویرایش]
- انگلیسی، مرتبسازی انتخابی
- [ کتاب مقدمه ای بر الگوریتمها(CLRS)]
پیوند به بیرون [ویرایش]
- Animated Sorting Algorithms: Selection Sort – graphical demonstration and discussion of selection sort
- Applet and source code
- Analyze Selection Sort in an online JavaScript IDE
- Selection Sort in C++
- Selection Sort Demonstration
- Pointers to selection sort visualizations
- C++ Program - Selection Sort
- Selection sort explained and C++ source code
|
|||||||||||||||||||||||||||||||

