首頁

目前文章總數:157 篇

  

最後更新:2024年 12月 07日

0007. 鴿巢排序法(Pigeon hole Sort)-穩定排序

日期:2023年 03月 04日

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

摘要:演算法-排序


時間複雜度(Time Complex): O(n)
空間複雜度(Space Complex): O(k) k => 陣列元素中的最大值-最小值
最佳時間: O(n + k)
最壞時間: O(n + k)
範例檔案:Source Code
範例專案:Code Project
基本介紹:本篇分為3大部分。
第一部分:鴿巢排序 - 介紹
第二部分:圖解範例說明
第三部分:代碼






第一部分:鴿巢排序 - 介紹

Step 1:原理


1. 輸入一可比較陣列
2. 建立(最大值-最小值)配置空間
3. 遍歷該可比較陣列,塞入到對應的配置空間中++
4. 遍歷配置空間由小開始遍歷一筆筆取出
最後取出的結果即為由小至大排序

Step 2:演算法流程圖




第二部分:圖解範例說明

Step 1:以整數陣列為例

初始內有5個值



第三部分:代碼

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

輸入一組數列 inputItem 求出 result


public void Execute()
{
    List<int> inputItem = new() { 92, 17, 8, 159, 26, 39 };
    var execute = new PigeonholeSort<int>();
    execute.PigeonholeSorting(inputItem);
}



Step 2:鴿巢排序代碼 - 主程式

主要三個流程
1. 建立空間
2. 塞入值轉換對應的索引位置
3. 轉換由小到大取出值


public class PigeonholeSort<T> where T : IComparable
{
    public List<int> PigeonholeSorting(List<int> items)
    {
        //1. 建立範圍空間
        int min = items.Min();
        int max = items.Max();
        int range = max - min + 1;
        int[] phole = new int[range];
        //2. 塞入對應的值
        for (int index = 0; index < items.Count(); index++)
            phole[items[index] - min]++;
        //3. 取出索引位置作為值的排序結果
        for (int index = 0, innerIndex = 0; innerIndex < range; innerIndex++)
            while (phole[innerIndex]-- > 0)
                items[index++] = innerIndex + min;
        return items;
    }
}