لیست بصورت تصادفی مرتب میشود
در علوم کامپیوتر، **مرتب‌سازی ساختگی** (به انگلیسی: Bogosor) (که به آن مرتب‌سازی تصادفی، مرتب‌سازی میمونی هم می‌گویند) یک روش غیر مؤثر در الگوریتم‌های مرتب‌سازی محسوب می‌شود. از این مرتب‌سازی برای اهداف آموزشی در تقابل با دیگر روش‌های واقع گرایانه در مرتب‌سازی به کار می‌رود. اگر در مرتب‌سازی دسته‌ای از کارت‌ها از مرتب‌سازی ساختگی استفاده شود، بدین صورت خواهد بود که ابتدا بررسی می‌شود که آیا لیست مرتب است یا خیر. اگر نبود، دوباره ترتیب کارت‌ها را تغییر می‌دهیم، و پردازه قبلی را دوباره اجرا می‌کنیم تا زمانی که به یک لیست مرتب از کارت‌ها برسیم. نام این مرتب‌سازی از واژه bogus به معنای جعلی و ساختگی آمده است.

شبه کد
------

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

```

while not InOrder(deck)
  do Shuffle(deck);

```

زمان اجرا
---------

زمان اجرای این مرتب‌سازی با فاکتوریل و توابع فرانمایی super-exponential می‌توان بیان کرد. نکته مهم در این است که بدترین حالت ممکن آن می‌تواند زمان اجرای بی‌نهایت داشته باشد.  

زمان اجرا در بدترین حالت در بی‌نهایت، در حالت میانگین در (O(n!.n و در حالت کمینه در (O(n خواهد بود.

مرتب‌سازی ساختگی و کوانتوم
--------------------------

الگوریتم در حالت کلی به صورت زیر است:

1. اگر لیست مرتب شده است، توقف کنید.
2. اگر مرتب نیست، لیست را به طور تصادفی در هم بریزید.
3. به مرحله ۱ بازگردید.

به طور واضح این الگوریتم کاملاً نابهینه است. هرچند راه حلی برای بهینه‌سازی آن وجود دارد که محاسبه کوانتومی quantum computing نام دارد. به دلیل اینکه بسیاری از فرضیه‌ها در فیزیک کوانتوم، چند جهانی many-universe هستند، یک لیست که به صورت تصادفی مرتب می‌شود، تعداد بی‌نهایتی از جهان‌ها را ایجاد می‌کند. در این حالت، محاسبه کوانتومی مرتب‌سازی ساختگی را در (O(n حل می‌کند. الگوریتم جدید به صورت زیر است:

1. لیست را به صورت تصادفی در هم بریزید.
2. اگر لیست مرتب شده است، توقف کنید.
3. اگر مرتب نیست، همه جهان را نابود کنید (destroy entire universe).

از آنجایی که لیست‌های نامرتب به طور کامل نابود می‌شود، پس بعد از اولین درهم سازی به طور کامل بهینه خواهد شد. بررسی مرتب بودن یک لیست نیازمند N-1 مقایسه است. اگر لیست مرتب نبود، این پیاده‌سازی از جهان‌ها را نابود می‌کنیم؛ و دوباره یک پیاده‌سازی از جهان‌ها را به دست می‌آوریم. چون هر جهان پس از نابودی تنها یک بار شاهد مقایسه‌ها خواهد بود. حال اگر هم فرض کنیم که جهان‌ها در (O(۱ می‌تواند نابود شود، پس برای هر جهان این مرتب‌سازی از (O(n زمان خواهد برد.

پیاده‌سازی
----------

در زیر پیاده‌سازی این مرتب‌سازی در دو زبان برنامه‌نویسی ++C و جاوا آمده است.

### زبان ++C

```
# include <iterator>
# include <algorithm>

template<typename ForwardIterator>
 void bogosort(ForwardIterator begin, ForwardIterator end)
{
 typedef std::iterator\_traits<ForwardIterator>::value\_type value\_type;

// if we find two adjacent values where the first is greater than the second, the sequence isn't sorted.
 while (std::adjacent\_find(begin, end, std::greater<value\_type>()) != end)
 std::random\_shuffle(begin, end);
}

```

### زبان Java

```
Random random = new Random();

/\*\*
 \* The main functional algorithm
 \* @param n The array to be sorted
 \*/
public void bogoSort(int[] n)
{
//Check to see if the array is in proper order
 while(!inOrder(n))
 {
//If the array is not in order, shuffle it
 shuffle(n);
 }
}

/\*\*
 \* Shuffles the array
 \* @param n The array to be shuffled
 \*/
public void shuffle(int[] n)
{
//Walk through the array
 for (int i = 0; i <n.length; i++)
 {
//Swap the current position with a random position farther down in the array
 int swapPosition = random.nextInt(i + 1);
 int temp = n[i];
 n[i] = n[swapPosition];
 n[swapPosition] = temp;
 }
}

/\*\*
 \* Checks to see if the array is in sorted, ascending order
 \* @param n The array to be checked
 \* @return True if the array is in order
 \*/
public boolean inOrder(int[] n)
{
//Walk through the array
 for (int i = 0; i <n.length - 1; i++)
 {
//Checks to see if the two positions being looked at are in proper order
 if (n[i]> n[i + 1])
 {
 return false;
 }
 }
 return true;
}

```

پانویس
------

1. 1 2 3  Gruber, H.; Holzer, M.; Ruepp, O. "Sorting the slow way: an analysis of perversely awful randomized sorting algorithms", *4th International Conference on Fun with Algorithms, Castiglioncello, Italy, 2007* (PDF), Lecture Notes in Computer Science, vol. 4475, Springer-Verlag, pp. 183–197, doi:10.1007/978-3-540-72914-3\_17.

منابع
-----

* 
* 
* 
* 

| * ن
* ب
* و
الگوریتم‌های مرتب‌سازی |
| --- |
| تئوری | 
* نظریه پیچیدگی محاسباتی
* نمادهای O و Ω و Θ
* ترتیب کامل
* الگوریتم مرتب‌سازی
* شبکه مرتب‌سازی
* مرتب‌سازی مقایسه‌ای

 |  |
| گونه‌های تعویضی | 
* حبابی
* دست‌نشانده
* زوج و فرد
* ساختگی
* سریع
* شانه‌ای
* کوکتلی
* گورزاد

 |
| گونه‌های انتخابی | 
* انتخابی
* دایره‌ای
* درخت دکارتی
* روان
* مسابقه‌ای
* هرمی

 |
| گونه‌های درجی | 
* درجی
* درختی
* شکیبانه
* صدفی
* کتابخانه‌ای
* گسترده

 |
| گونه‌های ادغامی | 
* ادغامی آبشاری
* ادغامی چندمرحله‌ای
* ادغامی نوسانی
* ادغامی
* رشته‌ای

 |
| گونه‌های توزیعی | 
* انفجاری
* پایه‌ای
* پرچم آمریکا
* مجاور-نگاشت (پروکس‌مپ)
* سطلی
* شمارشی
* فلش
* لانه‌کبوتری
* مهره‌ای

 |
| گونه‌های همرو | 
* ادغامی دسته‌ای فرد-زوج
* بایتونیک
* جفتی

 |
| گونه‌های دوگانه | 
* آن‌شافل
* تیم
* جی‌سورت
* درونگرا
* گسترش‌یافته

 |
| گونه‌های دیگر | 
* اسپاگتی
* توپولوژیکی
* کلوچه‌ای

 |