مرتب‌سازی ساختگی

از ویکی‌پدیا، دانشنامهٔ آزاد
(تغییرمسیر از مرتب‌سازی بوگو)
پرش به: ناوبری، جستجو
مرتب‌سازی ساختگی
کلاس الگوریتم مرتب‌سازی
ساختمان داده‌ها آرایه
عملکرد بدترین حالت بی کران[۱]
عملکرد بهترین حالت \Omega(n)[۱]
عملکرد حالت متوسط O(n \times n!)[۱]
پیچیدگی فضایی بدترین حالت O(n)

در علوم کامپیوتر، مرتب سازی ساختگی (به انگلیسی: 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. ۱٫۰ ۱٫۱ ۱٫۲ 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, Lecture Notes in Computer Science 4475, Springer-Verlag, pp. 183–197, doi:10.1007/978-3-540-72914-3_17 .

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