مرتبسازی رشتهای
مرتبسازی رشتهای (مرتبسازی 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;
}