مرتبسازی ساختگی
در علوم کامپیوتر، مرتبسازی ساختگی (به انگلیسی: Bogosor) (که به آن مرتبسازی تصادفی، مرتبسازی میمونی هم میگویند) یک روش غیر مؤثر در الگوریتمهای مرتبسازی محسوب میشود. از این مرتبسازی برای اهداف آموزشی در تقابل با دیگر روشهای واقع گرایانه در مرتبسازی به کار میرود. اگر در مرتبسازی دستهای از کارتها از مرتبسازی ساختگی استفاده شود، بدین صورت خواهد بود که ابتدا بررسی میشود که آیا لیست مرتب است یا خیر. اگر نبود، دوباره ترتیب کارتها را تغییر میدهیم، و پردازه قبلی را دوباره اجرا میکنیم تا زمانی که به یک لیست مرتب از کارتها برسیم. نام این مرتبسازی از واژه bogus به معنای جعلی و ساختگی آمده است.
رده | الگوریتم مرتبسازی |
---|---|
ساختمان داده | آرایه |
کارایی بدترین حالت | بی کران |
کارایی بهترین حالت | |
کارایی متوسط | |
پیچیدگی فضایی |
شبه کد
شبه کد الگوریتم این مرتبسازی به صورت زیر است:
while not InOrder(deck) do Shuffle(deck);
زمان اجرا
زمان اجرای این مرتبسازی با فاکتوریل و توابع فرانمایی super-exponential میتوان بیان کرد. نکته مهم در این است که بدترین حالت ممکن آن میتواند زمان اجرای بینهایت داشته باشد.
زمان اجرا در بدترین حالت در بینهایت، در حالت میانگین در (O(n!.n و در حالت کمینه در (O(n خواهد بود.
مرتبسازی ساختگی و کوانتوم
الگوریتم در حالت کلی به صورت زیر است:
- اگر لیست مرتب شده است، توقف کنید.
- اگر مرتب نیست، لیست را به طور تصادفی در هم بریزید.
- به مرحله ۱ بازگردید.
به طور واضح این الگوریتم کاملاً نابهینه است. هرچند راه حلی برای بهینهسازی آن وجود دارد که محاسبه کوانتومی 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;
}
پانویس
- ↑ 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.