AlgoVerse

مرتب‌سازی انتخابی

در هر دور کوچک‌ترین عضو بخش نامرتب را پیدا می‌کند و آن را به ابتدای همان بخش می‌برد.

آرایه دو بخش دارد: بخش مرتب در ابتدا و بخش نامرتب بعد از آن. در هر دور، کوچک‌ترین عضو بخش نامرتب پیدا می‌شود و با اولین عضو همان بخش جابه‌جا می‌شود. بعد از دور i، خانه‌ی i جای نهایی‌اش را دارد.

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

پنج عدد درهم؛ چهار دور، هر دور یک عضو در جای نهایی‌اش می‌نشیند.

  1. def selection_sort(a):
  2. n = len(a)
  3. for i in range(n - 1):
  4. smallest = i
  5. for j in range(i + 1, n):
  6. if a[j] < a[smallest]:
  7. smallest = j
  8. a[i], a[smallest] = a[smallest], a[i]
  9. return a

ناوردا: در شروع هر دور، a[0..i−1] شامل i کوچک‌ترین عضو آرایه است، به ترتیب.

شروع اجرا

640251122223114

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

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

a list

6425122211

Call stack

  1. selection_sort()خط 1
گام ۱ از ۴۵
خط سیاه = start · خط نارنجی = گام کلیدیcompare: 0/10 · swap: 0/4 · start: 0/4 · new_min: 0/5

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

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

    • comparisons
    • swaps
    • ورودی فعلی (n=5)
    05010015046810121416n = تعداد عضوهای آرایهcomparisonsswaps
    نمایش به شکل جدول
    ncomparisonsswaps
    463
    6155
    8287
    10459
    126611
    149113
    1612015
    توضیح

    ایده

    آرایه دو بخش دارد: بخش مرتب در ابتدا و بخش نامرتب بعد از آن. در هر دور، کوچک‌ترین عضو بخش نامرتب پیدا می‌شود و با اولین عضو همان بخش جابه‌جا می‌شود. بعد از دور i، خانه‌ی i جای نهایی‌اش را دارد.

    هزینه

    • تعداد مقایسه‌ها همیشه n(n − 1)/2 است، هر ورودی‌ای که باشد: O(n²).
    • تعداد جابه‌جایی‌ها حداکثر n − 1 است؛ وقتی نوشتن در حافظه گران است، این مزیت مهمی است.
    • حافظه‌ی اضافه O(1).

    پایداری

    جابه‌جایی کوچک‌ترین عضو با a[i] ممکن است عضوی را از کنار عضو برابرش رد کند، پس مرتب‌سازی انتخابی پایدار نیست.

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

    • فلش smallest کوچک‌ترین عضو تا اینجا را نشان می‌دهد و j بقیه‌ی بخش را مرور می‌کند.
    • شمار compare را در «از قبل مرتب» و «برعکس مرتب» مقایسه کن: یکی است.