مرتب‌سازی کند

از testwiki
نسخهٔ تاریخ ۲۱ ژانویهٔ ۲۰۲۳، ساعت ۱۱:۳۱ توسط imported>GodNey (ویرایش Demsn (بحث) به آخرین تغییری که Rezabot انجام داده بود واگردانده شد)
(تفاوت) → نسخهٔ قدیمی‌تر | نمایش نسخهٔ فعلی (تفاوت) | نسخهٔ جدیدتر ← (تفاوت)
پرش به ناوبری پرش به جستجو

الگو:For مرتب‌سازی کند (به انگلیسی: Slowsort) نوعی الگوریتم مرتب‌سازی است که جنبهٔ شوخی داشته و کاربردی نمی‌باشد. این الگوریتم بر مبنای قاعده ضرب و تسلیم (کنایه به تقسیم و غلبه) عمل می‌کند. این الگوریتم در سال ۱۹۸۶ توسط آندره برودر و جورج استولفی ابداع شد.[۱]

الگوریتم

مرتب‌سازی کند یک الگوریتم بازگشتی است.

شبه کد پیاده‌سازی درجای آن به صورت زیر می‌باشد: الگو:چپ‌چین

 procedure slowsort(A,i,j)
 if i>= j then return
 m := ⌊(i+j)/2⌋
 slowsort(A,i,m)                                    // (1.1)
 slowsort(A,m+1,j)                                  // (1.2)
 if A[j] <A[m] then swap A[j] and A[m]             // (1.3)
 slowsort(A,i,j-1)                                  // (2)

الگو:پایان چپ‌چین

  • مرتب‌سازی قسمت اول به صورت بازگشتی (۱٫۱)
  • مرتب‌سازی قسمت دوم به صورت بازگشتی (۲٫۲)
  • یافتن بیشینه کل آرایه با استفاده از مقایسه نتایج ۱٫۱ و ۲٫۲ و قرار دادن این عنصر در انتهای آرایه (۱٫۳)
  • مرتب‌سازی کل آرایه به جز عنصر بیشینهٔ پیدا شده مرحلهٔ ۱٫۳ به صورت بازگشتی

پیاده‌سازی این الگوریتم در هسکل (یه صورت تابعی خالص) به صورت زیر است.

 الگو:چپ‌چین

slowsort :: Ord a => [a] -> [a]

 slowsort xs
 | length xs <= 1 = xs
 | otherwise      = slowsort xsnew ++ [max llast rlast] -- (2)
 where
 l     = slowsort $ take m xs -- (1.1)
 r     = slowsort $ drop m xs -- (1.2)
 llast = last l
 rlast = last r
 xsnew = init l ++ min llast rlast: init r
 m     = fst (divMod (length xs) 2)

الگو:پایان چپ‌چین

پیچیدگی زمانی

زمان اجرای مرتب‌سازی کند برابر با T(n)=2T(n/2)+T(n1)+1 می‌باشد؛ بنابراین به ازای هر ϵ>0 , T(n) از مرتبه زمانی Ω(nlog2(n)(2+ϵ)) for any ϵ>0 می‌باشد؛ بنابراین مرتبه زمانی مرتب‌سازی کتد چند جمله ای نیست و حتی در بهترین حالت بدتر از مرتب‌سازی جبابی است.

منابع

الگو:پانویس الگو:مرتب‌سازی