首頁

目前文章總數:157 篇

  

最後更新:2024年 12月 07日

0012. 猴子排序法 / bogo sort / Quantum bogodynamics (Bogo Sort)-不穩定排序

日期:2023年 03月 19日

標籤: Algorithm Sort NoParactical Algorithm C# Asp.NET Core

摘要:演算法-排序


時間複雜度(Time Complex): O(n - n!)
空間複雜度(Space Complex): O(n)
最佳時間: O(n)
最壞時間: 無限
範例檔案:Source Code
範例專案:Code Project
基本介紹:本篇分為3大部分。
第一部分:Bogo排序 - 介紹
第二部分:圖解範例說明
第三部分:代碼






第一部分:Bogo排序 - 介紹

Step 1:原理

給定一組可比較陣列
1-1. 檢查可比較陣列是否由小到大排序
1-2. 不是時洗牌
1-3. 重複1-1, 1-2 直到由小到大
2. 完成排序

Step 2:演算法流程圖




第二部分:圖解範例說明

Step 1:以整數陣列為例

初始內有4個值


第三部分:代碼

Step 1:Bogo排序代碼 - 呼叫進入點

輸入一組數列 inputItem 求出 result


public void Execute()
{
    List<int> inputItem = new() { 92, 17, 38, 59, 26, 39 };
    var bogoSort = new BogoSort<int>();
    var result = bogoSort.BogoSorting(inputItem);
}



Step 2:插入排序代碼 - 主程式

主要三個流程
1. 輸入陣列隨機排序
2. 檢查是否由小到大,沒有重複 1.、2.步驟
3. 完成


/// <summary>
/// Bogo排序 - Quantum bogodynamics / bozo sort / 猴子排序
/// </summary>
/// <param name="items">一串可比較的陣列 EX: [3,2,5,1,4]</param>
/// <returns>倒序的陣列 EX: [5,4,3,2,1]</returns>
public List<T> BogoSorting(List<T> items)
{
    while (!IsAscendingSort(ref items))
    {
        Shuffle(ref items);
    }
    return items;
}
/// <summary>
/// 洗牌-O(N)
/// </summary>
private static void Shuffle(ref List<T> items)
{
    var random = new Random(Guid.NewGuid().GetHashCode());
    for (int index = 0; index < items.Count - 1; index++)
    {
        //Swap
        int valA = random.Next(0, items.Count);
        int valB = new Random(random.Next(0, 1000)).Next(0, items.Count);
        T temp = items[valA];
        items[valA] = items[valB];
        items[valB] = temp;
    }
}
/// <summary>
/// 是否為升序排序
/// </summary>
/// <returns></returns>
private static bool IsAscendingSort(ref List<T> items)
{
    for (int index = 0; index < items.Count - 1; index++)
    {
        if (items[index].CompareTo(items[index + 1]) > 0)
        {
            return false;
        }
    }
    return true;
}