首頁

目前文章總數:157 篇

  

最後更新:2024年 12月 07日

0018. 希爾排序法(Shell Sort)-不穩定排序

日期:2023年 04月 23日

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

摘要:演算法-排序


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






第一部分:希爾排序法 - 介紹

Step 1:原理

給定一組可比較陣列
1. 設定一個自定義間隔值interval
2. 當前可比較陣列的數量的gap值 (count / interval)
3. 遍歷可比較陣列依照gap值做比較,小的進行交換
4. 縮減gap值 (gap = gap / interval) 若gap值大於0 重複2-4步驟
5. 完成排序

Step 2:演算法流程圖




第二部分:圖解範例說明

Step 1:以整數陣列為例

初始內有9個值,設定Interval = 3



第三部分:代碼

Step 1:希爾排序法代碼 - 呼叫進入點

輸入一組數列 inputItem 求出 result


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



Step 2:希爾排序法代碼 - 主程式

主要四個流程
1. 設定間隔值
2. 遍歷陣列,依照間隔值小的進行交換
3. 縮減間隔值,直到0,否則重複2步驟
4. 完成排序


public class ShellSort<T> where T : IComparable
{
    public List<T> ShellSorting(List<T> items)
    {
        int interval = 3;
        int gap = items.Count() / interval > 1 ? interval + 1
                                               : 1;
        while (gap >= 1)
        {
            for (int index = gap; index < items.Count(); index++)
            {
                for (int compareIndex = index; 
                    gap <= compareIndex && items[compareIndex].CompareTo(items[compareIndex-gap]) < 0; 
                    compareIndex = compareIndex - gap
                    )
                {
                    // 交換元素位置
                    T temp = items[compareIndex];
                    items[compareIndex] = items[compareIndex - gap];
                    items[compareIndex - gap] = temp;
                }
            }
            gap /= interval;
        }
        return items;
    }
}