مرتبسازی رشتهای
| کلاس | الگوریتم مرتبسازی |
|---|---|
| داده ساختار | فهرست پیوندی |
| بدترین زمان اجرا | O(n²) |
| بهترین زمان اجرا | O(n) |
| زمان اجرای متوسط | O(n²) |
| بدترین پیچیدگی حافظه | O(1) |
| بهینه | ? |
مرتب سازی رشتهای (مرتب سازی Strand) یکی از الگوریتم مرتبسازی ادغامی میباشد .عملیاتی در استخراج مکرر فهرستهای فرعی مرتب شده خارج از آن فهرستی که باید مرتب شود و ادغام آنها با یکدیگر که خروجی یک آرایه نتیجه میباشد. در هر تکرار از بین فهرست نامرتب شده، یک مجموعه اعضاء استخراج میشود که قبلا مرتب بودند و ادغام آن مجموعه ها با هم.
-
- "این الگوریتم زمانی کارایی خوبی دارد که داده های زیادی به ترتیب (نظم ارتباطی) داشته باشیم.
- از فهرست های فرعی برای استخراج دادها از فهرست اصلی استفاده می کنیم همچنین دادههای بعدی باید بزرگتر از داده قبلی باشه و ترتیب وضعیت را حفظ کنند و بارها استخراج و ادغام در فهرست فرعی ها تا زمانیکه که همه داده ها مرتب شوند انجام می شود."
نام این الگوریتم از "رشته یا Strand" که از دادههای مرتب شده در فهرست نامرتب، که در یک زمان حذف میشود میآید. و این مرتب سازی مقایسه ی که علت استفاده از مقایسه های که هنگام حذف رشتهها و زمانی که آنها با ادغام شدنشان درون آرایه، مرتب شده می باشد.
الگوریتم مرتب سازی رشته ای (Strand Sort)روش مناسبی برای داده های که در یک فهرست پیوندی ذخیره می شوند با توجه به اضافه و حذف مکرر داده های که داریم و در دیگر موارد استفاده ساختمان داده ای مانند یک آرایه، تا حد زیادی زمان اجرا و پیچیدگی الگوریتم به علت طولانی بودن اضافه ها و حذف ها، افزایش می یابد. الگوریتم مرتب سازی رشته ای روش مناسبی برای داده ای است که از قبل حجم زیادی از داده ها مرتب شده باشند، زیرا که داده ها را می توان در یک رشته واحد برداشته شوند .
محتویات |
بدترین حالت[ویرایش]
این الگوریتم در بدترین حالت (یک فهرست که به ترتیب معکوس مرتب سازی شده باشد)از مرتبهٔ Θ(n۲) است.
حالت متوسط[ویرایش]
این الگوریتم در حالت متوسط از مرتبهٔ Θ(n۲) است.
بهترین حالت[ویرایش]
بهترین حالت این است که فهرست قبلا مرتب شدهباشد که در این حالت الگوریتم از مرتبه O(n) است.
مثال[ویرایش]
| فهرست نامرتب | فهرست فرعی | فهرست مرتب |
|---|---|---|
| ۳ ۱ ۵ ۴ ۲ | ||
| ۱ ۴ ۲ | ۳ ۵ | |
| ۱ ۴ ۲ | ۳ ۵ | |
| ۲ | ۱ ۴ | ۳ ۵ |
| ۲ | ۱ ۳ ۴ ۵ | |
| ۲ | ۱ ۳ ۴ ۵ | |
| ۱ ۲ ۳ ۴ ۵ |
- یکبار فهرست نامرتب تجزیه میشود، عددهای صعودی (مرتب شده) گرفته میشوند.
- فهرست فرعی (مرتب شده) را در صورتی که بار اول تکرارش باشد درون فهرست خالی ذخیره میکند.
- دوباره تجزیه فهرست نامرتب و گرفتن عددهای نسبتا مرتب شده.
- از آنجایی که فهرست مرتب سازی شده در حال حاضر پره شده، ادغام فهرستهای فرعی در فهرست مرتب شده انجام میشود.
- تکرار گامهای (۳-۴) تا زمانیکه هر دو فهرست نا مرتب و فهرست فرعی خالی شوند.
الگوریتم[ویرایش]
در زیر شبه کد پیاده سازی الگوریتم رشته میباشد.
procedure strandSort( A : list of sortable items ) defined as:
while length( A ) > ۰
clear sublist
sublist[ ۰ ] := A[ ۰ ]
remove A[ ۰ ]
for each i in ۰ to length( A ) - ۱ do:
if A[ i ] > sublist[ last ] then
append A[ i ] to sublist
remove A[ i ]
end if
end for
merge sublist into results
end while
return results
end procedure
Haskell پیاده سازی با[ویرایش]
merge [] l = l merge l [] = l merge l۱@(x۱:r1) l۲@(x۲:r2) = if x۱ < x2 then x۱:(merge r1 l۲) else x۲:(merge l1 r۲) ssort [] = [] ssort l = merge strand (ssort rest) where (strand, rest) = foldr extend ([], []) l extend x ([],r) = ([x],r) extend x (s:ss,r) = if x <= s then (x:s:ss,r) else (s:ss,x:r)
پیاده سازی به زبان پی اچ پی[ویرایش]
function strandsort(array $arr) { $result = array(); while (count($arr)) { $sublist = array(); $sublist[] = array_shift($arr); $last = count($sublist)-۱; foreach ($arr as $i => $val) { if ($val > $sublist[$last]) { $sublist[] = $val; unset($arr[$i]); $last++; } } if (!empty($result)) { foreach ($sublist as $val) { $spliced = false; foreach ($result as $i => $rval) { if ($val < $rval) { array_splice($result, $i, ۰, $val); $spliced = true; break; } } if (!$spliced) { $result[] = $val; } } } else { $result = $sublist; } } return $result; }
منابع[ویرایش]
- Strand Sort "Strand Sort" from English Wikipedia
|
|||||||||||||||||||||||||||||||