مرتبسازی بوگو
محتویات |
الگوریتم[ویرایش]
در علوم کامپیوتر، مرتب سازی بوگو (که به آن مرتب سازی تصادفی، مرتب سازی میمونی هم میگویند) یک روش غیر موثر در الگوریتمهای مرتب سازی محسوب میشود. از این مرتب سازی برای اهداف آموزشی در تقابل با دیگر روشهای واقع گرایانه در مرتب سازی به کار میرود. اگر در مرتب سازی دسته ای از کارتها از مرتب سازی بوگو استفاده شود، بدین صورت خواهد بود که ابتدا بررسی میشود که آیا لیست مرتب است یا خیر. اگر نبود، دوباره ترتیب کارتها را تغییر میدهیم، و پردازه قبلی را دوباره اجرا میکنیم تا زمانی که به یک لیست مرتب از کارتها برسیم. نام این مرتب سازی از واژه bogus به معنای جعلی و ساختگی آمده است.
شبه کد[ویرایش]
شبه کد الگوریتم این مرتب سازی به صورت زیر است:
while not InOrder(deck) do Shuffle(deck);
زمان اجرا[ویرایش]
زمان اجرای این مرتب سازی با فاکتوریل و توابع فرانمایی super-exponential میتوان بیان کرد. نکته مهم در این است که بدترین حالت ممکن آن میتواند زمان اجرای بی نهایت داشته باشد.
زمان اجرا در بدترین حالت در بی نهایت، در حالت میانگین در (O(n!.n و در حالت کمینه در (O(n خواهد بود.
مرتب سازی بوگو و کوانتوم[ویرایش]
الگوریتم در حالت کلی به صورت زیر است :
- اگر لیست مرتب شده است، توقف کنید.
- اگر مرتب نیست، لیست را به طور تصادفی در هم بریزید.
- به مرحله 1 بازگردید.
به طور واضح این الگوریتم کاملا نابهینه است. هرچند راه حلی برای بهینه سازی آن وجود دارد که محاسبه کوانتومی quantum computing نام دارد. به دلیل اینکه بسیاری از فرضیهها در فیزیک کوانتوم، چند جهانی many-universe هستند، یک لیست که به صورت تصادفی مرتب میشود، تعداد بی نهایتی از جهانها را ایجاد میکند. در این حالت، محاسبه کوانتومی مرتب سازی بوگو را در (O(n حل میکند. الگوریتم جدید به صورت زیر است:
- لیست را به صورت تصادفی در هم بریزید.
- اگر لیست مرتب شده است، توقف کنید.
- اگر مرتب نیست، همه جهان را نابود کنید (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; }
منابع[ویرایش]
- مشارکتکنندگان ویکیپدیا، «Bogosort»، ویکیپدیای انگلیسی، دانشنامهٔ آزاد (بازیابی در ۲ می ۲۰۱۱).
- http://rosettacode.org/wiki/Sorting_algorithms/Bogosort#C.2B.2B
- http://www.mathnews.uwaterloo.ca/Issues/mn11103/QuantumBogoSort.php
- http://www.codecodex.com/wiki/Bogosort
- http://rosettacode.org/wiki/Sorting_algorithms/Bogosort#C.2B.2B
|
|||||||||||||||||||||||||||||||