AlgoVerse

مرتب‌سازی درجی

مثل مرتب کردن کارت‌های بازی در دست: هر عضو را برمی‌دارد و در جای درستش در بخش مرتب‌شده‌ی سمت چپ می‌گذارد.

مرتب‌سازی درجی مثل مرتب کردن کارت‌های بازی در دست است. سمت چپ آرایه همیشه مرتب است. در هر دور، عضو بعدی (key) برداشته می‌شود، عضوهای بزرگ‌تر از آن در بخش مرتب یک خانه به راست می‌روند، و key در جای خالی قرار می‌گیرد.

ادامه‌ی توضیح ↓
ورودی:
n=6خروجی PDF

شش عدد درهم که در چند دور مرتب می‌شوند؛ مناسب برای دنبال کردن دست‌به‌دست.

  1. def insertion_sort(a):
  2. for j in range(1, len(a)):
  3. key = a[j]
  4. i = j - 1
  5. while i >= 0:
  6. if a[i] <= key:
  7. break
  8. a[i + 1] = a[i]
  9. i = i - 1
  10. a[i + 1] = key
  11. return a

ناوردا: در شروع هر دور حلقه‌ی بیرونی، a[0..j−1] همان عضوهای اولیه‌ی آن بخش است، ولی مرتب‌شده.

شروع اجرا

502142631435

متغیرهای محلی

نارنجی = در همین گام عوض شد

a list

524613

Call stack

  1. insertion_sort()خط 1
گام ۱ از ۷۰
خط سیاه = pick · خط نارنجی = گام کلیدیcompare: 0/12 · pick: 0/5 · shift: 0/9 · insert: 0/5

    رشد تعداد عملیات با اندازه‌ی ورودی

    میانگین ۱۲ گراف تصادفی برای هر n (با seed ثابت). نشانگر توخالی = ورودی فعلی.

    • comparisons
    • shift
    • insert
    • ورودی فعلی (n=6)
    02040608046810121416n = تعداد عضوهای آرایهcomparisonsshiftinsert
    نمایش به شکل جدول
    ncomparisonsshiftinsert
    45.13.33
    610.97.65
    817.6127
    1028.421.39
    1238.729.411
    1454.34313
    1670.858.415
    توضیح

    ایده

    مرتب‌سازی درجی مثل مرتب کردن کارت‌های بازی در دست است. سمت چپ آرایه همیشه مرتب است. در هر دور، عضو بعدی (key) برداشته می‌شود، عضوهای بزرگ‌تر از آن در بخش مرتب یک خانه به راست می‌روند، و key در جای خالی قرار می‌گیرد.

    گام‌ها

    1. از خانه‌ی j = 1 شروع کن؛ بخش a[0..0] به‌تنهایی مرتب است.
    2. key = a[j] را بردار.
    3. با i از j − 1 به عقب برو. تا وقتی a[i] > key است، a[i] را یک خانه به راست ببر.
    4. وقتی به عضوی رسیدی که ≤ key است (یا به ابتدای آرایه)، key را در a[i + 1] بگذار.
    5. j را یکی زیاد کن و تکرار کن.

    هزینه

    • بهترین حالت (آرایه‌ی مرتب): هر key فقط یک مقایسه دارد، پس O(n).
    • بدترین حالت (آرایه‌ی برعکس): key شماره‌ی j باید از کنار j عضو رد شود، پس روی هم n(n − 1)/2 جابه‌جایی و O(n²).
    • حافظه‌ی اضافه فقط O(1) است: مرتب‌سازی درجا انجام می‌شود.

    پایداری

    چون شرط توقف a[i] ≤ key است، عضوهای برابر هیچ‌وقت از کنار هم رد نمی‌شوند. پس ترتیب نسبی عضوهای برابر حفظ می‌شود و مرتب‌سازی پایدار است. در ورودی «عضوهای تکراری» این را ببین.

    در trace به چه چیزی نگاه کنی

    • فلش‌های i و j زیر میله‌ها جای دو اندیس را نشان می‌دهند و key بالای آرایه نوشته شده است.
    • میله‌ی نارنجی خانه‌ای است که در همین گام نوشته شد. میله‌ی با حاشیه‌ی نارنجی همان است که با key مقایسه می‌شود.
    • شمار shift را در «بهترین حالت» و «بدترین حالت» مقایسه کن.