مرتب ساز درجی ( Insertion Sort ) یک الگوریتم مرتب سازی ساده بر مبنای مقایسه است. این الگوریتم برای تعداد داده های زیاد، کارآمد نیست و در این موارد، الگوریتم های بهتری مثل مرتب ساز سریع، مرتب ساز ادغامی و مرتب ساز پشته وجود دارد.
این الگوریتم، بعضی مزایا هم دارد:
• پیاده سازی آن راحت است.
• برای داده های کم، کارآمدتر است.
• برای مرتب سازی مجموعه دادههای تقریباً مرتب شده، کارآمد است: اگر تعداد وارونگی ها، d باشد، این الگوریتم دارای زمان اجرای ( O ( n + d خواهد بود.
• در عمل از بسیاری از الگوریتم های ( O ( n۲ مثل مرتب ساز انتخابی یا مرتب ساز حبابی، بهتر عمل می کند: متوسط زمان اجرای آن هم، ( O ( n۲ است که در بهترین حالت، خطی است.
• پایدار است. ( ترتیب نسبی عناصر یکسان را حفظ می کند )
• درجا است. ( حافظه اضافی ثابت، ( O ( ۱ لازم دارد )
• یک الگوریتم برخط است. یعنی یک لیست را به محض دریافت کردن، مرتب می کند.
این الگوریتم به این صورت عمل می کند که تمام عناصر لیست را یکی یکی برمی دارد و آن را در موقعیت مناسب در بخش مرتب شده قرار می دهد. انتخاب عنصر مورد نظر، اختیاری است و می تواند توسط هر الگوریتم انتخابی، انتخاب شود. مرتب سازی درجی به صورت درجا عمل می کند. نتیجه عمل بعد از k مرحله، حاوی k عنصر انتخاب شده به صورت مرتب شده است.
معمول ترین نسخه از این الگوریتم که روی آرایه ها عمل می کند، به این صورت است:
• فرض کنید یک تابع به اسم Insert داریم که داده را در بخش مرتب شده در ابتدای آرایه درج می کند. این تابع با شروع از انتهای سری شروع به کار می کند و هر عنصر را به سمت راست منتقل می کند تا وقتی که جای مناسب برای عنصر جدید پیدا شود. این تابع این اثر جانبی را دارد که عنصر دقیقاً بعد از بخش مرتب شده را رونویسی می کند.
• برای اعمال مرتب ساز درجی، از انتهای سمت چپ آرایه شروع می کنیم و با صدا زدن تابع insert، هر عنصر را به موقعیت درستش می بریم. آن بخشی که عنصر فعلی را در آن می کنیم، در ابتدای آرایه و در اندیس هایی است که آن ها را قبلاً آزمایش کرده ایم. هر بار صدا زدن تابع insert، یک عنصر را رونویسی می کند، اما این مسئله مشکلی ایجاد نمی کند، زیرا این داده، همانی است که الان در حال درج آن هستیم.
یک شبه کد ساده از الگوریتم به صورت زیر است. در اینجا آرایه ها از صفر شروع می شوند و حلقه for هم دارای هر دو کران بالا و پایین است ( مثل پاسکال ) :
این نوشته برگرفته از سایت ویکی پدیا می باشد، اگر نادرست یا توهین آمیز است، لطفا گزارش دهید: گزارش تخلفاین الگوریتم، بعضی مزایا هم دارد:
• پیاده سازی آن راحت است.
• برای داده های کم، کارآمدتر است.
• برای مرتب سازی مجموعه دادههای تقریباً مرتب شده، کارآمد است: اگر تعداد وارونگی ها، d باشد، این الگوریتم دارای زمان اجرای ( O ( n + d خواهد بود.
• در عمل از بسیاری از الگوریتم های ( O ( n۲ مثل مرتب ساز انتخابی یا مرتب ساز حبابی، بهتر عمل می کند: متوسط زمان اجرای آن هم، ( O ( n۲ است که در بهترین حالت، خطی است.
• پایدار است. ( ترتیب نسبی عناصر یکسان را حفظ می کند )
• درجا است. ( حافظه اضافی ثابت، ( O ( ۱ لازم دارد )
• یک الگوریتم برخط است. یعنی یک لیست را به محض دریافت کردن، مرتب می کند.
این الگوریتم به این صورت عمل می کند که تمام عناصر لیست را یکی یکی برمی دارد و آن را در موقعیت مناسب در بخش مرتب شده قرار می دهد. انتخاب عنصر مورد نظر، اختیاری است و می تواند توسط هر الگوریتم انتخابی، انتخاب شود. مرتب سازی درجی به صورت درجا عمل می کند. نتیجه عمل بعد از k مرحله، حاوی k عنصر انتخاب شده به صورت مرتب شده است.
معمول ترین نسخه از این الگوریتم که روی آرایه ها عمل می کند، به این صورت است:
• فرض کنید یک تابع به اسم Insert داریم که داده را در بخش مرتب شده در ابتدای آرایه درج می کند. این تابع با شروع از انتهای سری شروع به کار می کند و هر عنصر را به سمت راست منتقل می کند تا وقتی که جای مناسب برای عنصر جدید پیدا شود. این تابع این اثر جانبی را دارد که عنصر دقیقاً بعد از بخش مرتب شده را رونویسی می کند.
• برای اعمال مرتب ساز درجی، از انتهای سمت چپ آرایه شروع می کنیم و با صدا زدن تابع insert، هر عنصر را به موقعیت درستش می بریم. آن بخشی که عنصر فعلی را در آن می کنیم، در ابتدای آرایه و در اندیس هایی است که آن ها را قبلاً آزمایش کرده ایم. هر بار صدا زدن تابع insert، یک عنصر را رونویسی می کند، اما این مسئله مشکلی ایجاد نمی کند، زیرا این داده، همانی است که الان در حال درج آن هستیم.
یک شبه کد ساده از الگوریتم به صورت زیر است. در اینجا آرایه ها از صفر شروع می شوند و حلقه for هم دارای هر دو کران بالا و پایین است ( مثل پاسکال ) :
wiki: مرتب سازی درجی