首頁

目前文章總數:157 篇

  

最後更新:2024年 12月 07日

0017. 選擇排序法(Selection Sort)-不穩定排序

日期:2023年 04月 22日

標籤: 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. 往下一個索引前進,重複1,2步驟
備註:相較於泡沫排序,只有在真正需要交換時才交換,時間複雜度雖然一樣差,但實際上比泡沫排序快很多(少了數值頻繁交換)

Step 2:演算法流程圖




第二部分:圖解範例說明

Step 1:以整數陣列為例

初始內有4個值


第三部分:代碼

Step 1:選擇排序法代碼 - 呼叫進入點

輸入一組數列 inputItem 求出 result


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



Step 2:選擇排序法代碼 - 主程式

主要四個流程
1. 遍歷陣列由索引0開始,找一個最小值
2. 交換到索引0,往下一個索引
3. 重複1,2步驟,排序完成


public class SelectionSort<T> where T : IComparable
{
    public List<T> SelectionAscendingSort(List<T> items)
    {
        int index = 0;
        //1. 遍歷 
        for (int keyIndex = 0; keyIndex < items.Count() - 1; keyIndex++)
        {
            //2. 找出最小值 
            var minIndex = keyIndex + 1;
            for (index = keyIndex + 1; index < items.Count; index++)
            {                    
                if (items[index].CompareTo(items[keyIndex]) < 0 &&
                    items[index].CompareTo(items[minIndex]) < 0)
                {
                    minIndex = index;
                }
            }
            //3. 如果當前keyIndex 已經是最小值則不用交換
            if (items[keyIndex].CompareTo(items[minIndex]) < 0)
                continue;
            //4. 發現最小值進行minIndex 與 keyIndex交換
            var temp = items[keyIndex];
            items[keyIndex] = items[minIndex];
            items[minIndex] = temp;
        }
        return items;
    }
}