مرتب‌سازی رشته‌ای

از ویکی‌پدیا، دانشنامهٔ آزاد
پرش به: ناوبری، جستجو
مرتب‌سازی رشته‌ای
کلاس الگوریتم مرتب‌سازی
ساختمان داده‌ها لیست پیوندی
عملکرد بدترین حالت O(n^2)
عملکرد بهترین حالت O(n)
عملکرد حالت متوسط O(n^2)
پیچیدگی فضایی بدترین حالت O(1) کمکی

مرتب‌سازی رشته‌ای (مرتب‌سازی Strand) یکی از الگوریتم مرتب‌سازی ادغامی می‌باشد. عملیاتی در استخراج مکرر فهرست‌های فرعی مرتب شده خارج از آن فهرستی که باید مرتب شود و ادغام آنها با یکدیگر که خروجی یک آرایه نتیجه می‌باشد. در هر تکرار از بین فهرست نامرتب شده، یک مجموعه اعضاء استخراج می‌شود که قبلا مرتب بودند و ادغام آن مجموعه‌ها با هم.

"این الگوریتم زمانی کارایی خوبی دارد که داده‌های زیادی به ترتیب (نظم ارتباطی) داشته باشیم.
از فهرست‌های فرعی برای استخراج دادها از فهرست اصلی استفاده می‌کنیم همچنین دادههای بعدی باید بزرگتر از داده قبلی باشه و ترتیب وضعیت را حفظ کنند و بارها استخراج و ادغام در فهرست فرعی‌ها تا زمانیکه که همه داده‌ها مرتب شوند انجام می‌شود."

نام این الگوریتم از "رشته یا Strand" که از داده‌های مرتب شده در فهرست نامرتب، که در یک زمان حذف می‌شود می‌آید؛ و این مرتب‌سازی مقایسهٔ که علت استفاده از مقایسه‌های که هنگام حذف رشته‌ها و زمانی که آنها با ادغام شدنشان درون آرایه، مرتب شده می‌باشد.

الگوریتم مرتب‌سازی رشته‌ای (Strand Sort)روش مناسبی برای داده‌های که در یک فهرست پیوندی ذخیره می‌شوند با توجه به اضافه و حذف مکرر داده‌های که داریم و در دیگر موارد استفاده ساختمان داده‌ای مانند یک آرایه، تا حد زیادی زمان اجرا و پیچیدگی الگوریتم به علت طولانی بودن اضافه‌ها و حذف‌ها، افزایش می‌یابد. الگوریتم مرتب‌سازی رشته‌ای روش مناسبی برای داده‌ای است که از قبل حجم زیادی از داده‌ها مرتب شده باشند، زیرا که داده‌ها را می‌توان در یک رشته واحد برداشته شوند.

بدترین حالت[ویرایش]

این الگوریتم در بدترین حالت (یک فهرست که به ترتیب معکوس مرتب‌سازی شده باشد) از مرتبهٔ Θ(n۲) است.

حالت متوسط[ویرایش]

این الگوریتم در حالت متوسط از مرتبهٔ Θ(n۲) است.

بهترین حالت[ویرایش]

بهترین حالت این است که فهرست قبلا مرتب شده‌باشد که در این حالت الگوریتم از مرتبه O(n) است.

مثال[ویرایش]

فهرست نامرتب فهرست فرعی فهرست مرتب
۳ ۱ ۵ ۴ ۲
۱ ۴ ۲ ۳ ۵
۱ ۴ ۲ ۳ ۵
۲ ۱ ۴ ۳ ۵
۲ ۱ ۳ ۴ ۵
۲ ۱ ۳ ۴ ۵
۱ ۲ ۳ ۴ ۵
  1. یکبار فهرست نامرتب تجزیه می‌شود، عددهای صعودی (مرتب شده) گرفته می‌شوند.
  2. فهرست فرعی (مرتب شده) را در صورتی که بار اول تکرارش باشد درون فهرست خالی ذخیره می‌کند.
  3. دوباره تجزیه فهرست نامرتب و گرفتن عددهای نسبتا مرتب شده.
  4. از آنجایی که فهرست مرتب‌سازی شده در حال حاضر پره شده، ادغام فهرست‌های فرعی در فهرست مرتب شده انجام می‌شود.
  5. تکرار گام‌های (۳-۴) تا زمانیکه هر دو فهرست نا مرتب و فهرست فرعی خالی شوند.

الگوریتم[ویرایش]

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

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۱@(:r1) l۲@(:r2) =
    if< x2 then:(merge r1 l۲) else:(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;
}