Sort - Ilbeygi Bros
Download
Report
Transcript Sort - Ilbeygi Bros
مهدی ایل بیگی
دانشگاه آزاد اسالمی دماوند
زمستان 89
• بطور کلی الگوریتم های مرتب سازی به دو دسته تقسیم می شوند:
.1مرتببب سببازی دا لببی ) :(Internalدر ایببن نببو از مرتببب سببازیم تباشببر مرتببب شببوند ه گببی در
حافظه اشلی قرار دارند و اشلی ترین ت لیات برای مرتب سازی ت ل مقایسه مبی باشبد .ت بامی
الگوریتم هایی که در این فصل معرفی می شوند از این دسته هستبد.
ببم تباشببر
.2مرتببب سببازی ببار ی ( :)Externalدر ایببن نببو مرتببب سببازیم بببدلیل بببا بببود
مرتببب شببوند فقببی بز ب ه از هببا در حافظببه اشببلی قبرار مببی کنننببد و ت ببل عیببن کببببد زمببا
اجرام دستنس ه به تباشر می باشد.
•
نکت ببه :1اک ببر الگ ببوریتم مرت ببب س ببازی ترت ببب تباش ببر ب ببا شلی ببد مس بباوی را در رای ببه مرت ببب ش ببد م ح بظ
ن ایدم به این الگوریتم الگوریتم مرتب سازی پایدار ) (Stableک ته می شود.
•
نکته :2اکر الگبوریتم مرتبب سبازی از ف بای ک ابی ابب (غنبن واسسبته ببه عبداد تباشبر ورودی) ببرای
مرتب سازی است اد ن ایدم الگوریتم مرتب سازی درجا ( )inplaceواند می شود و در غنن این
شورت Outplaceنامید می کردد.
2
• در ایببن الگببوریتمم در هببر مرحلببه از مرتببب سببازی بنرکتببنین یببا شببو کتنین تبصببر شباسببایی مببی شببود و
سپس با یک جابجایی به محل درس ود انتقال پیدا می کبد.
• مثال :رایه زیر را با الگوریتم مرتب سازی انتزابیم مرتب کبید.
– در ای ببن مث ببال م ببا در ه ببر مرحل ببه بنرکت ببنین تبص ببر را شباس ببایی ک ببرد و ب ببا ی ببک جابج ببایی ب ببه ان ه ببای
ل س می بریم.
3
مرحله اول
20, 15, 35, 4, 32
مرحله دوم
20, 15, 32, 4, 35
مرحله سوم
20, 15, 4, 32, 35
مرحله هارم
4, 15, 20, 32, 35
};index = j
)For(i = n-1; i ≥ 0; i--
{
;]max = x[1
;index = 1
)for(j = 0; j ≤ i; j++
;]if(x[j] ≥ max){max = x[j
;]x[index] = x[i
;x[i] = max
}
• ای ببن الگ ببوریتم Stableاس ب .در ای ببن الگ ببوریتم ع ببداد مقایس ببه ه ببا و جابج ببایی ه ببا در هت ببنین حال ب
(مرتب بود رایه) و در بدترین حال (هیچ تبصری در جای ود نباشد) بصورت زیر می باشد:
4
• در این الگوریتمم برای مرتبب سبازی رایبه ای ببا nانبهم نیباز ببه n-1ببار پی بایآ رایبه وجبود داردم
که در هر بار هر تبصر با تبصر سعدی ود مقایسه می شود و در شور ی کبه از بنرکتبن باشبد (در
مرتب سازی شعودی)م جای ها عویض می کردد .پس در ان های هر کذر ماا صبیی یبک تبصبر
مشخص می شود و به ه ن ترت ب تا n-1مرحله پ آ می رویم.
• مثال:
20, 15, 35, 4, 32
15, 20, 35, 4, 32
15, 20, 4, 35, 32
پایا پی ایآ اول
15, 20, 4, 32, 35
15, 4, 20, 32, 35
4, 15, 20, 32, 35
5
void BubbleSort(int[] A)
{
int N = A.length;
int flag = 1;
for(int i=0 ; i < N && flag == 1; i++ ){
flag = 0;
for(int j=0; j > N-i ; j ++){
if (A[j] > A[j+1]){
swap (A[j] , A[j+1]) ;
flag = 1;
}
}
}
}
6
• الگوریتم مرتب سازی حبابی stableاس .
• هتببنین حالب ببرای ایببن الگببوریتم زمبباای اسب کببه رایببه مرتببب اسب .زیبرا در ایببن حالب هببیچ جابجببایی
انجببام ن ببه شببود .ببرای شببخیص ایببن مببورد از یببک flagدر کببد اسببقید قبببل اسببت اد شببد کببه زمبباای
کببه هببیچ جابجببایی در یببک passشببورت نرنببند برابببر شب ر بببا ی مببی مانببد و باتب ات ببه یببافت حلقببه
اشببلی مببی کببردد .در نتیجببه در هتببنین حالب بببا ) O(nمتوجببه مببی شببویم کببه رایببه مرتببب اسب و شببار را
ات ه می دهیم.
• بدترین حال برای این الگوریتم زماای اس که رایه شامق نامرتب باشد.
• در حال کلی مرتبه زماای برای این الگوریتم بصورت زیر می باشد:
7
• در این الگوریتم در هر مرحله یک تبصر محور( )Pivotانتزاب می شود و سپس ه ه تباشر رایبه
بپ
ببا تبصببر محبور مقایسببه مببی شبوند و تباشببر شببو کتن از تبصبر محببور ببه یببک سب (مبثق سب
رای ببه) مبتق ببل م ببی ش ببوند و بقی ببه تباش ببر ب ببه سب ب دیر ببر مبتق ببل م ببی ش ببوند .ب ببدین ش ببورت در پایب با
مقایسببه هببای یببک مرحلببهم تبصببر محببور در جببای صببیی ببود ق برار مببی کنببند .در ادامببه رایببه را بببه دو
قسب (تباشببر شببو کتن از محببور و تباشببر بنرکتببن از محببور) تقسببیم مببی کبببیم و ببرای هببر قسب یببک
محور در نظر می کننیم و مانبد روش فوق مرتب سازی را ادامه می دهیم.
• مع و تبصر ابتدای رایه را سعبوا تبصر محور در نظر می کننند.
• برای یافت ماا صیی تبصر محورم تاسعی به نام Partitionرا عریف مبی ن باییم کبه یبک رایبه
را در یاف می ن اید و تبصر ابتدای را سعبوا محبور در نظبر مبی کنبند و سبپس تباشبر دیربر رایبه
پ رایه
را با این تبصر مقایسه می کبد و در شور ی که تبصری از محور شو کتن باشد به س
ببپ
مبتقببل مببی شببود و درمهایب ماببا تبصببر محببور را بطببوری کببه تباشببر شببو کتن از درسب
قرار کننندم مشخص می ن اید.
باشبد و تباشر بنرکتن در س راس
8
• در ایببن مثببال نحببو ت لکببرد تبباس Partitionن ببایآ داد مببی شببود .در واقب ابتببدا تبصببر اول رایببه
سعبوا محور انتزاب می شود و اندیس iماا این تبصر را اشا می دهد .سپس تباشر دیربر کبه
بببا انببدیس jبببه هببا اشببار مببی شببود بببا تبصببر محببور مقایسببه مببی شببوند و در شببور ی کببه از محببور
شببو کتن باشبببد جابجببا مببی شببوند و انببدیس iننببی یببک واحببد افبنایآ مببی یابببد تببا بببه ماببا جدیببد تبصببر
محور اشار ن اید .مثال:
9
10
11
12
Pاندیس ابتدای آرایه و qاندیس انتهای آن می باشد int PARTITION(A, p, q) //
{
;]int pivot = A[p
;int i = p
مرتبه زمانی این تابع
)for (j = p + 1; j <= q; j++
) O(nمی باشد
{
{)if(A[j] ≤ pivot
;i ++
تابع swapجای دو عنصر از آرایه
swap (A[i], A[j]); //
را با هم تعویض می نماید
}
}
;)]Swap(A[p], A[i
!// final place of pivot
;return i
}
Quickمب ب ب ببی باشب ب ب ببد ابتب ب ب ببدا بصب ب ب ببورت
• تب ب ب بباس زیب ب ب ببر کب ب ب ببه پیب ب ب بباد سب ب ب ببازی الگب ب ب ببوریتم Sort
QUICKSORT(A,فرا ببواای م ببی ک ببردد و در ه ببر مرحل ببه ب ببا فرا ببواای ت بباس
1,
)n
Partitionماا یک تبصر (محور) را بدس می ورد و سپس به سراغ دو زیر رایه پ و راسب
تبصببر محببور مببی رود تببا ببرای هببر کببدام ار ایببن دو قسب ننببی ه ببن ت ببل را تکبرار کبببد .ه ببن رببور شبار
ادامببه مببی یابببد تببا مهایتببا بببه رایببه هببایی برسببیم کببه انببدیس ابتببدای مهببا بببا انببدیس ان هببای هببا مسبباوی
می شود یعنه به رایه های تک تبصری می رسیم که مرتببد (شرط ات ه مرتب سازی).
{)QUICKSORT(A, p, r
)if (p < r
{
;)q = PARTITION(A, p, r
;)QUICKSORT(A, p, q - 1
;)QUICKSORT(A, q + 1, r
}
}
13
• ایببن الگببوریتم مرتببب سببازی از روش تقسببیم و غلبببه ببرای مرتببب سببازی اسببت اد مببی ن ایببد .بببدین معنببه
که در هر مرحله جای تبصر محور مشخص شبد و رایبه ببه دو زیر رایبه تقسبیم مبی شبود و الگبوریتم
ببرای هببر کببدام از ایببن زیر رایببه هببا تکبرار مببی کببردد تببا در مهای ب بببه زیببر رایببه هببای تببک تبصببری (مرتببب)
برسیم.
• این الگوریتم Stableن س .
• بببدترین حالب ببرای ایببن الگببوریتم زمبباای اسب کببه رایببه مرتببب باشببد .زیبرا در ایببن حالب تبصببر محببور
در ابتببدای رایببه بببا ی مببی مانببد و رایببه بببه دو زیر رایببه تقسببیم ن ببه شببود و شببار بببه ه ببن ترت بب ادامببه مببی
یابد.
• هتنین ت لکرد این الگوریتم زماای اس کبه رایبه نامرتبب باشبد .در حالب کلبی ببرای مرتببه زمباای ایبن
رایه واهیم داش :
14
• در این روش بصورت زیر ت ل می کبیم:
– تبصر اول رایه ] x[1بصورت ببدییه مرتبب اسب .تبصبر ] x[2را قببل یبا سعبد از تبصبر ]x[1
بگونه ای درج می کبیم که ] x[1و ] x[2مرتب باشبد.
– در ادامببه تبصببر ] x[3را بگونببه ای در ] x[1], x[2درج مببی کبببیم تببا ]x[1], x[2], x[3
مرتب باشبد و ه ن رور تا ] x[nپ آ می رویم.
• مثال:
]x[1], x[2], x[3], x[4], x[5
4, 32
20, 15, 35,
4, 32
15, 20, 35,
4, 32
15, 20, 35,
4, 15, 20, 35, 32
15
4, 15, 20, 32, 35
void InsertionSort(int[] A)
{
int N = A.length;
for(i = 1 ; i < N ; i++)
{
key = A[i];
for(j = i-1; j >= 0 && A[j] > key ; j--)
A[ j+1] = A[j] ;
A[ j + 1] = key;
}
}
16
•
این الگوریتم Stableمی باشد.
• این الگوریتم برای رایه هایی با عداد تباشر کم ()n ≤ 20م سسیار مباسب می باشد.
• هتببنین حالب ببرای ایببن الگببوریتم زمبباای اسب کببه رایببه مرتببب باشببد زیبرا در ایببن حالب هببیچ جابجببایی
بن تباشبر ات باق ن به افتبد و فقبی بایبد ت بامی تباشبر رایبه بررسب ه شبوند پبس مرتببه اجرایبی در ایبن
حال ) O(nمی باشد.
• بدترین حال برای این الگوریتم زماای اس کبه رایبه مرتبب شبد معابود باشبدم زیبرا در ایبن حالب
ب ش ببتنین جابج ببایی ب ببن تباش ببر ات بباق م ببی افت ببد پ ببس بب برای nتبص ببر در رای ببه مرتب ببه زم بباای براب ببر ب ببا
) O(n2می باشد.
• در حال کلی برای پیچیدگی زماای این الگوریتم واهیم داش :
17
• در این الگوریتم برای مرتب سازی رایه هام ابتدا هر تبصر رایه سعبوا یک رایه مرتب تک تبصری در
نظببر کرفتببه مببی شببود و سببپس ایببن رایببه هببای تببک تبصببریم دو بببه دو بببا یکببدیرر ادغببام مببی شببوند و رایببه
های دوتبصبری مرتبب را مبی سبازند .در ادامبه رایبه هبای دو تبصبری مرتبب دو ببه دو ببا هبم ادغبام شبد و
رای ببه ه ببای ه ببار تبص ببری مرت ببب را ایج ببادمی ن ایب ببد و س ببپس ه ببن روال ت ببا رس ببید ب ببه ی ببک رای ببه مرت ببب
ادامه پیدا واهد کرد.
• مثال:
4, 32, 12
12, 32
12, 32
20, 15, 35,
4, 35
15, 20
4, 15, 20, 35
4, 12, 15, 20, 32 , 35
18
• برای ادغام دو رایه ابتبدا دو تبصبر ابتبدایی هبا را مقایسبه مبی ن باییم و تبصبر شبو کتن را ببه رایبه
مهبایی ادغببامم انتقببال مبی دهببیم و تبصببر دوم رایبه ای کببه تبصببر شبو کتن از انتزبباب شببد را بجببای
تبصببر اول درنظببر مببی کنببنیم و بببه ه ببن ش ببورت تببا ان هببا ت ببامی تباشببر دو رایببه را مقایسببه و تبص ببر
شو کتن را به رایه مهایی انتقال می دهیم.
• الگبوریتم مرتبب سببازی ادغبامم Stableاسب .ولببی اشباال ت ببد ایبن الگبوریتم نیازمبببدی
رایه ک ای با nتبصر می باشد .پس این الگوریتم outplaceاس .
ببه یببک
• ایببن الگببوریتم ببرای مرتببب کببرد رایببه ای بببا nتبصببر حببداکهن بببه log nمرحلببه نیازمبببد اسب زیبرا
تباشببر رایببه دو بببه دو و سببپس هببار بببه هببار و بببه ه ببن ترت ببب (تببوا هببایی از )2بببا هببم ادغببام م ببی
شبوندم پبس در ب ادغبام حبداکهن دارای ت ب log nواهبد ببود .از ربر دیربر در هبر مرحلبه ببرای
ادغام تباشر ت امی زیر رایه هبام در مهایب nمقایسبه نیباز اسب م درنتیجبه مرتببه زمباای ایبن الگبوریتم
در هر حالته ( هتنین و بدترین حال ) برابر با ) O(n log nواهد بود.
19
• ه ببانطور کببه در فصببل در ب هببای ویببت ک تببه شببدم از در ب Heapمببی تببوا ب برای مرتببب سببازی
رایه ها است اد ن ود .الگوریتم مرتب سازی Heapدو مرحله دارد:
.1سا ت یک در
Heapبا است اد از تباشر رایه.
.2حذ مکرر ریشه و اضافه کرد
به ل س مرتبم تا رین کر در
.
•
بدلیل ایبکه در Heapیک در دودویی شامل اسب و ت لیبات حبذ از ببا )O(log n
شببورت پببذیر واهببد بببود و از نجاسیکببه ب برای بدس ب ورد رایببه مرتببب بایببد nبببار ت ببل حببذ را
انجببام دهببیمم پببس مرتبببه زمبباای مرتببب سببازی Heapببرای هببر رایببه nتبصببریم برابببر بببا O(n
) log nواهد بود.
•
البته سا در Heapببا nتبصبر ننبی از مرتببه زمباای ) O(n log nمبی باشبدم پبس مرتببه
زماای واقعی این الگبوریتم ) O(2n log nمبی باشبد کبه در مهایب ه با ) O(n log nواهبد
شد.
•
ب برای س ببا در ب Heapنی بباز ب ببه ی ببک رای ببه nتبص ببری اض ببافی داری ببمم ول ببی م ببی ت ببوا ب ببا برنام ببه
نویس ب ه ه ببا رایببه ورودی را بببه در ب Heapتبببدیل ن ببود و نیبباز بببه ف ببای اضببافی را ننببی حببذ
کرد .البته الگوریتم Heap Sortمتعادل ن س .
20
• ببرای مرتببب سببازی بببا ایببن الگببوریتم از در ب جسببتجوی دودویببی ) (BSTاسببت اد مببی ن بباییم .بببدین
معن ببه ک ببه ابت ببدا ب ببا اس ببت اد از تباش ببر رای ببه ی ببک BSTم ببی س ببازیم و س ببپس ب ببا پی ببایآ میانون ببدی
) (inorderاین در م تباشر بصورت شعودی مرتب می شوند.
• از نجاییکببه ببرای سببا BSTنیبباز بببه ف ببای اضببافی (واسسببته بببه عببداد تباشببر رایببه) داریببمم پبس
الگوریتم Tree Sortدرجا ) (inplaceن ه باشد.
• مسببهله Stableبببود در ایببن الگببوریتمم اشببق مطببرز ن ببه شببود زیبرا در در ب BSTکببر هببایی بببا
شلید برابر نزواهیم داش .
• اکر در BSTسا ته شبد از روی یبک رایبه nتبصبریم یبک در ب متعبادل شبود (دارای ت ب
)log nم در نتیجببه مرتبببه زمبباای سببا ایببن در ب ) O(n log nواهببد شببد و در غنببن ایببن
شببورت مرتبببه زمبباای سببا در ب BSTبرابببر بببا ) O(n2واهببد بببود .درنتیجببه مرتبببه زمبباای ایببن
الگببوریتم در هتببنین حالب و حالب متوسببی برابببر ) O(n log nواهببد بببود و در بببدترین حالب
) O(n2می باشد.
21