首頁

目前文章總數:157 篇

  

最後更新:2024年 12月 07日

0019. 臭皮匠排序法(Stooge Sort)-不穩定排序

日期:2023年 05月 07日

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

摘要:演算法-排序


時間複雜度(Time Complex): O(n²·⁷⁰⁹)
空間複雜度(Space Complex): O(n)
最佳時間: O(n²·⁷⁰⁹)
最壞時間: O(n²·⁷⁰⁹)
範例檔案:Source Code
範例專案:Code Project
應用場景:公司開始把程式碼行數當KPI時,可以把代碼擴增,並且增加潛在程式的優化空間,是真正意義上的臭皮匠
基本介紹:本篇分為3大部分。
第一部分:臭皮匠排序法 - 介紹
第二部分:圖解範例說明
第三部分:代碼






第一部分:臭皮匠排序法 - 介紹

Step 1:原理

給定一組可比較陣列
1. 遍歷元素,當第一個數值大於最後一個數值時交換
2. 如果當前集合元素數量大於等於3,依序以下順序處理
3-1. 排序前2/3 的元素
3-2. 排序後2/3 的元素
3-3. 排序前2/3 的元素
5. 排序完成

Step 2:演算法流程圖




第二部分:圖解範例說明

Step 1:以整數陣列為例

初始內有6個值


第三部分:代碼

Step 1:臭皮匠排序法代碼 - 呼叫進入點

輸入一組數列 inputItem 求出 result


public void Execute()
{
    List<int> inputItem = new() { 92, 17, 38, 59, 26, 39, 41, 75, 6 };
    var stoogeSort = new StoogeSort<int>();
    var result = stoogeSort.StoogeAscendingSorting(inputItem);

}



Step 2:臭皮匠排序法代碼 - 主程式

主要三個流程
1. 遍歷,頭大於尾交換
2. 前2/3,後2/3,前2/3 排序交換,重複1.直到遍歷完畢
3. 完成排序


public class StoogeSort<T> where T : IComparable
{
    public List<T> StoogeAscendingSorting(List<T> items)
    {
        //將排序的起訖丟入,進行排序
        return StoogeSortMethod(items, 0, items.Count() - 1);
    }
    public List<T> StoogeSortMethod(List<T> items, int startIndex, int endIndex)
    {
        //規則1. 如果最後一個值小於第一個值,則交換這兩個數
        if (items[startIndex].CompareTo(items[endIndex]) > 0)
        {
            var temp = items[startIndex];
            items[startIndex] = items[endIndex];
            items[endIndex] = temp;
        }
        //規則2. 如果當前集合元素數量大於等於3,依序以下順序處理
        if ((endIndex - startIndex) > 1)
        {
            var length = (endIndex - startIndex + 1) / 3;//索引由0開始,所以+1
            StoogeSortMethod(items, startIndex, endIndex - length);//排序前2/3
            StoogeSortMethod(items, startIndex + length, endIndex );//排序後2/3
            StoogeSortMethod(items, startIndex, endIndex - length);//排序前2/3
        }
        return items;
    }
    public void Swap(ref T valueA, ref T valueB)
    {
        var temp = valueA;
        valueA = valueB;
        valueB = temp;
    }
}