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‬‬