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

بندانگشتی|مثالی از مرتب سازی رشته ای
**مرتب‌سازی رشته‌ای (مرتب‌سازی 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 پیاده‌سازی با

```ocaml
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)
```


### پیاده‌سازی به زبان پی اچ پی

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


## منابع


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