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

از ویکی‌پدیا، دانشنامهٔ آزاد
مرتب‌سازی رشته‌ای
ردهالگوریتم مرتب‌سازی
ساختمان دادهلیست پیوندی
کارایی بدترین حالت
کارایی بهترین حالت
کارایی متوسط
پیچیدگی فضایی کمکی
مثالی از مرتب سازی رشته ای

مرتب‌سازی رشته‌ای (مرتب‌سازی 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 @(:r1) @(:r2) =
    if  < x2 then :(merge r1 ) else :(merge l1 )

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;
}

منابع[ویرایش]

  1. IT enabled practices and emerging management paradigms. Gupta, I. C. (Ishwar Chandra), 1946-, Jaroliya, Deepak., Prestige Institute of Management and Research. (1st ed.). Indore: Prestige Institute of Management and Research. 2008. ISBN 9788174466761. OCLC 641462443.{{cite book}}: نگهداری CS1: سایر موارد (link)