📜  BogoSort或排列排序

📅  最后修改于: 2021-05-06 22:44:30             🧑  作者: Mango

BogoSort也称为置换排序,愚蠢排序,慢速排序,shot弹枪排序或猴子排序是一种基于生成和测试范式的特别无效的算法。该算法会连续生成其输入的排列,直到找到已排序的排列。(Wiki)
例如,如果将bogosort用于对一副纸牌进行排序,则将包括检查该纸牌是否井然有序;如果不是,则将纸牌扔到空中,随机拾起纸牌,然后重复直到对卡片组进行排序为止的过程。

伪代码:

while not Sorted(list) do
    shuffle (list)
done


例子:

让我们考虑一个示例数组(3 2 5 1 0 4)
4 5 0 3 2 1(第一次混洗)
4 1 3 2 5 0(第二次改组)
1 0 3 2 5 4(第三次改组)
3 1 0 2 4 5(第4次改组)
1 4 5 0 3 2(第5次改组)



0 1 2 3 4 5(nth改组)-排序数组

这里,n是未知的,因为算法未知,在哪个步骤中将得出结果排列进行排序。

C++
// C++ implementation of Bogo Sort
#include
using namespace std;
  
// To check if array is sorted or not
bool isSorted(int a[], int n)
{
    while ( --n > 1 )
        if (a[n] < a[n-1])
            return false;
    return true;
}
  
// To generate permuatation of the array
void shuffle(int a[], int n)
{
    for (int i=0; i < n; i++)
        swap(a[i], a[rand()%n]);
}
  
// Sorts array a[0..n-1] using Bogo sort
void bogosort(int a[], int n)
{
    // if array is not sorted then shuffle
    // the array again
    while ( !isSorted(a, n) )
        shuffle(a, n);
}
  
// prints the array
void printArray(int a[], int n)
{
    for (int i=0; i


Java
// Java Program to implement BogoSort
public class BogoSort
{
    // Sorts array a[0..n-1] using Bogo sort
    void bogoSort(int[] a)
    {
        // if array is not sorted then shuffle the
        // array again
        while (isSorted(a) == false)
            shuffle(a);
    }
  
    // To generate permuatation of the array
    void shuffle(int[] a)
    {
         // Math.random() returns a double positive
         // value, greater than or equal to 0.0 and
         // less than 1.0.
         for (int i=1; i <= n; i++)
             swap(a, i, (int)(Math.random()*i));
    }
  
    // Swapping 2 elements
    void swap(int[] a, int i, int j)
    {
        int temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }
  
    // To check if array is sorted or not
    boolean isSorted(int[] a)
    {
        for (int i=1; i


Python
# Python program for implementation of Bogo Sort
import random
  
# Sorts array a[0..n-1] using Bogo sort
def bogoSort(a):
    n = len(a)
    while (is_sorted(a)== False):
        shuffle(a)
  
# To check if array is sorted or not
def is_sorted(a):
    n = len(a)
    for i in range(0, n-1):
        if (a[i] > a[i+1] ):
            return False
    return True
  
# To generate permuatation of the array
def shuffle(a):
    n = len(a)
    for i in range (0,n):
        r = random.randint(0,n-1)
        a[i], a[r] = a[r], a[i]
  
# Driver code to test above
a = [3, 2, 4, 1, 0, 5]
bogoSort(a)
print("Sorted array :")
for i in range(len(a)):
    print ("%d" %a[i]),


C#
// C# implementation of Bogo Sort
using System; 
    
class GFG 
{ 
    // To Swap two given numbers
    static void Swap(ref T lhs, ref T rhs)
    {
        T temp;
        temp = lhs;
        lhs = rhs;
        rhs = temp;
    }
      
    // To check if array is sorted or not 
    public static bool isSorted(int[] a, int n) 
    { 
        int i = 0;
        while(ia[i+1])
                return false;
            i++;
        }
        return true;
    } 
        
    // To generate permuatation of the array 
    public static void shuffle(int[] a, int n) 
    { 
        Random rnd = new Random();
        for (int i=0; i < n; i++) 
            Swap(ref a[i], ref a[rnd.Next(0,n)]); 
    } 
        
    // Sorts array a[0..n-1] using Bogo sort 
    public static void bogosort(int[] a, int n) 
    { 
        // if array is not sorted then shuffle 
        // the array again 
        while ( !isSorted(a, n) ) 
            shuffle(a, n); 
    } 
        
    // prints the array 
    public static void printArray(int[] a, int n) 
    { 
        for (int i=0; i


输出:

Sorted array :
0 1 2 3 4 5 

时间复杂度:

  • 最坏的情况:O(∞)(因为该算法没有上限)
  • 平均情况:O(n * n!)
  • 最好的情况:O(n)(当给定的数组已经排序时)

辅助空间: O(1)