首頁

目前文章總數:157 篇

  

最後更新:2024年 12月 07日

0015. 煎餅排序法(PanCake Sort)-不穩定排序

日期:2023年 04月 15日

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

摘要:演算法-排序


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






第一部分:煎餅排序法 - 介紹

Step 1:原理

給定一組可比較陣列
1. 找出該陣列最大長度的值,並且記錄位置
2. 最大值放在該陣列最大長度的位置(最後一筆)
3. 反轉從位置0到最大長度值得位置
4. 再次反轉從位置0到當前該陣列最大長度的值的位置
5. 重複1. - 4. 步驟

Step 2:演算法流程圖




第二部分:圖解範例說明

Step 1:以整數陣列為例

初始內有4個值



第三部分:代碼

Step 1:煎餅排序法代碼 - 呼叫進入點

輸入一組數列 inputItem 求出 result


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



Step 2:煎餅排序法代碼 - 主程式

主要四個流程
1. 找出最大值
2. 反轉陣列、再反轉陣列
3. 重複1. 2. 直到全部遍歷
4. 排序完成


public class PancakeSort<T>
{
    public List<T> PancakeAscendingSorting(List<T> items)
    {            
        //1. 翻滾所有的煎餅 O(N)
        for (int index = items.Count -1 ; index >= 0; index--)
        {
            //轉回Count
            var count = index + 1;
            //每次取當前全部可翻滾的項目 (每次都會把一個最大的值放在最後面)
            var findMaxIndex = items.IndexOf(items.Take(count).Max());
            var findMaxIndexCount = findMaxIndex + 1;
            //2. 從起點到最大的煎餅翻滾(反轉) => O(N/2)
            items.Reverse(0, findMaxIndexCount);
            //3. 再翻滾(反轉)當前全部可翻滾的項目 => O(N/2)
            items.Reverse(0, count);
        }
        //4. 最後將會得到由小到大的排序結果
        return items;
    }
}