برنامه مرتب سازی درجی (Insertion sort) در زبان برنامه نویسی C
مرتب ساز درجی (Insertion Sort) یک الگوریتم مرتب سازی ساده بر مبنای مقایسه است. این الگوریتم برای تعداد دادههای زیاد، کارآمد نیست و در این موارد، الگوریتمهای بهتری مثلمرتبساز سریع، مرتبساز ادغامی و مرتبساز پشته وجود دارد.
مزایای این الگوریتم چیست ؟
- پیاده سازی آن راحت است.
- برای دادههای کم، کارآمدتر است.
- برای مرتب سازی مجموعه دادههای تقریباً مرتب شده، کارآمد است: اگر تعداد وارونگیها، d باشد، این الگوریتم دارای زمان اجرای (O(n + d خواهد بود.
- در عمل از بسیاری از الگوریتمهای (O(n۲ مثل مرتب ساز انتخابی یا مرتب ساز حبابی، بهتر عمل میکند: متوسط زمان اجرای آن هم، (O(n۲ است که در بهترین حالت، خطی است.
- پایدار است. (ترتیب نسبی عناصر یکسان را حفظ میکند.)
- درجا است. (حافظه اضافی ثابت، (O(۱ لازم دارد.)
- یک الگوریتم برخط است. یعنی یک لیست را به محض دریافت کردن، مرتب میکند.
نحوه عملکرد الگوریتم
این الگوریتم به این صورت عمل میکند که تمام عناصر لیست را یکی یکی برمیدارد و آن را در موقعیت مناسب در بخش مرتب شده قرار میدهد. انتخاب عنصر مورد نظر، اختیاری است و میتواند توسط هر الگوریتم انتخابی، انتخاب شود. مرتبسازی درجی به صورت درجا عمل میکند. نتیجه عمل بعد از k مرحله، حاوی k عنصر انتخاب شده به صورت مرتب شده است.
معمولترین نسخه از این الگوریتم که روی آرایهها عمل میکند، به این صورت است:
- فرض کنید یک تابع به اسم Insert داریم که که داده را در بخش مرتب شده در ابتدای آرایه درج میکند. این تابع با شروع از انتهای سری شروع به کار میکند و هر عنصر را به سمت راست منتقل میکند تا وقتی که جای مناسب برای عنصر جدید پیدا شود. این تابع این اثر جانبی را دارد که عنصر دقیقاً بعد از بخش مرتب شده را رونویسی میکند.
- برای اعمال مرتبساز درجی، از انتهای سمت چپ آرایه شروع میکنیم و با صدا زدن تابع insert، هر عنصر را به موقعیت درستش میبریم. آن بخشی که عنصر فعلی را در آن میکنیم، در ابتدای آرایه و در اندیسهایی است که آنها را قبلاً آزمایش کردهایم. هر بار صدا زدن تابع insert، یک عنصر را رونویسی میکند، اما این مسئله مشکلی ایجاد نمیکند، زیرا این داده، همانی است که الان در حال درج آن هستیم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
/* insertion sort ascending order */ #include <stdio.h> int main() { int n, array[1000], c, d, t; printf("Enter number of elements\n"); scanf("%d", &n); printf("Enter %d integers\n", n); for (c = 0; c < n; c++) { scanf("%d", &array[c]); } for (c = 1 ; c <= n - 1; c++) { d = c; while ( d > 0 && array[d] < array[d-1]) { t = array[d]; array[d] = array[d-1]; array[d-1] = t; d--; } } printf("Sorted list in ascending order:\n"); for (c = 0; c <= n - 1; c++) { printf("%d\n", array[c]); } return 0; } |
پیروزباشید، طراح باشی
پیروز باشید!
طراح باشی
نوشتن دیدگاه