1. 程式人生 > >選擇排序——C#實現

選擇排序——C#實現

       一 演算法描述

       選擇排序(Selection sort)是一種簡單直觀的排序演算法。它的工作原理是每一次從待排序的資料元素中選出最小(或最大)的一個元素,存放在序列的起始位置,直到全部待排序的資料元素排完。

       二 演算法實現(C#)

       1 用於整數陣列的升序排序

        public static void SelectionSort(int[] array)
        {
            for (int i = 0; i < array.Length - 1; i++)
            {
                int minValueIndex = i;
                for (int j = i + 1; j < array.Length; j++)
                {
                    if (array[minValueIndex] > array[j])
                    {
                        minValueIndex = j;
                    }
                }

                if (minValueIndex != i)
                {
                    Exchange(ref array[i], ref array[minValueIndex]);
                }
            }
        }


       2 用於整數陣列的降序排列

        public static void SelectionDesSort(int[] array)
        {
            for (int i = 0; i < array.Length - 1; i++)
            {
                int maxValueIndex = i;
                for (int j = i + 1; j < array.Length; j++)
                {
                    if (array[maxValueIndex] < array[j])
                    {
                        maxValueIndex = j;
                    }
                }

                if (maxValueIndex != i)
                {
                    Exchange(ref array[i], ref array[maxValueIndex]);
                }
            }
        }

       3 泛型版本

        public static void SelectionSort<T>(T[] array, Comparison<T> comparison)
        {
            for (int i = 0; i < array.Length - 1; i++)
            {
                int extremumIndex = i;
                for (int j = i + 1; j < array.Length; j++)
                {
                    if (comparison(array[extremumIndex], array[j]) > 0)
                    {
                        extremumIndex = j;
                    }
                }

                if (extremumIndex != i)
                {
                    Exchange<T>(ref array[i], ref array[extremumIndex]);
                }
            }
        }

       輔助方法

        private static void Exchange(ref int x, ref int y)
        {
            int temp = x;
            x = y;
            y = temp;
        }

        private static void Exchange<T>(ref T x, ref T y)
        {
            T temp = x;
            x = y;
            y = temp;
        }


       三 演算法分析

       1  無論初始陣列的順序是怎樣的,每一次從待排序陣列中選取最小(大)值時,都需要遍歷比較待排序陣列的所有元素,所以選擇排序演算法的最佳和最壞情況的時間複雜度都是O(n^2)。

       2 選擇排序演算法是一種原址排序演算法。在整個排序過程中只需要常數個元素儲存在陣列之外,即空間複雜度為O(1)。

       3 選擇排序演算法是不穩定的。例如,若對陣列 3,3,2使用選擇排序演算法進行升序排序,則當3 與 2交換位置時,會導致兩個3的位置顛倒。

       四 執行結果

       在選擇排序演算法中,影響演算法執行時間的主要因素為每次查詢未排序陣列中最小(大)值的內層迴圈的執行次數。而內層迴圈的執行次數可以根據當前最小(大)值與未排序元素的比較次數來估算(此處內層迴圈的執行次數大約為比較次數的2倍)。

       在演算法的泛型實現版本中,通過在委託傳入的比較方法里加入計數語句,則能很容易的得到比較語句執行的次數。

private static int AscComparison(int x, int y)  
{  
    <span style="color:#ff0000;">count++;</span>  
    if (x > y)  
    {  
        return 1;  
    }  
    else if (x == y)  
    {  
        return 0;  
    }  
    else  
    {  
        return -1;  
    }  
}
        為了測試該演算法的平均執行情況,通過對10000個隨機陣列進行排序取平均:
static void Main(string[] args)  
{  
    for (int i = 0; i < 10000; i++)  
    {  
        //在1-100內產生10個隨機數  
        int[] randomIntArray = DataCreator.CreateRandomIntArray(1, 100, 10);  
        Sort.SelectionSort(randomIntArray, AscComparison);  
        PrintAarry(randomIntArray);  
    }  
    int averageCount = count / 10000;  
    Console.WriteLine(averageCount);  
} 

       測試結果:

       n = 10,  averageCount = 45 = 0.45* 10 ^2; 
       n = 100,   averageCount = 4950 = 0.5 * 100 ^ 2;
       n = 1000, averageCount = 499500 = 0.5 * 1000^2


       選擇排序演算法的平均執行時間複雜度也是θ(n^2)。

      另外,儘管都是時間複雜度為θ(n^2)的排序演算法,選擇排序演算法在輸入資料為任何情況下計算時間都幾乎相等,且與插入演算法在最壞情況下的計算時間相近,故而總體上插入排序演算法在計算時間上要優於選擇排序演算法。



相關推薦

選擇排序——C實現

return 最大 n-1 spa 工作 cnblogs ret clu 輸出 選擇排序:   選擇排序(Selection sort)是一種簡單直觀的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然後,再從剩余未排序元素中繼續

選擇排序(c++實現)

github部落格傳送門 csdn部落格傳送門 選擇排序原理: #include<iostream> using namespace std; const int MAX_NUM = 100; //選擇排序 int main(){ int a[MAX_NUM]; in

選擇排序——C#實現

       一 演算法描述        選擇排序(Selection sort)是一種簡單直觀的排序演算法。它的工作原理是每一次從待排序的資料元素中選出最小(或最大)的一個元素,存放在序列的起始位置,直到全部待排序的資料元素排完。        二 演算法實現(C#

排序演算法】選擇排序(C++實現)

選擇排序演算法就是每一趟從待排序的記錄中選出關鍵字最小(最大)的記錄,順序放在已排好序的子檔案的最後(最前),直到全部記錄排序完畢。常見的選擇排序有直接選擇排序(Selection Sort),堆排序(Heap Sort),平滑排序(Smooth Sort),笛卡爾樹排序(

排序演算法之選擇排序——C++實現

對於直接選擇排序演算法,是給每個位置選擇當前元素最小的,比如給第一個位置選擇最小的,在剩餘元素裡面給第二個元素選擇第二小的,依次類推,直到第n-1個元素,第n個 元素不用選擇了,因為只剩下它一個最大的元素了。那麼,在一趟選擇,如果當前元素比一個元素小,而該小的元素又出現在一個和當前元素相等的元素後面,那麼

【初探】“ 選擇排序 ” ——C++程式碼實現

  選擇排序(Selection sort)是一種簡單直觀的排序演算法。無論什麼資料進去都是 O(n²) 的時間複雜度。所以用到它的時候,資料規模越小越好。唯一的好處可能就是不佔用額外的記憶體空間了吧。   簡單排序處理流程 首先在未排序序列中找到最小

"選擇排序"C++/python實現

對一組資料進行選擇排序的方法是,在一組資料中找到最小的,排到第一位,然後從剩下的資料中找到第二個小的,排到第二位,逐次排序完成。 比如:3 ,7 ,9 ,10, 0這一組資料: 第一次排序:3,7,9,0,10,將最小的0排到第一位,3和0的位置交換,為0,7,9,3,1

常見排序演算法總結分析之選擇排序與歸併排序-C#實現

本篇文章對選擇排序中的簡單選擇排序與堆排序,以及常用的歸併排序做一個總結分析。 [常見排序演算法總結分析之交換排序與插入排序-C#實現](https://www.cnblogs.com/iwiniwin/p/12589405.html)是排序演算法總結系列的首篇文章,包含了一些概念的介紹以及交換排序(冒泡與

排序算法入門之選擇排序-Java實現

ati min .net 入門 oid 下標 static ava 對象數組 本文參考http://blog.csdn.net/m0_37568091/article/details/78023705 選擇排序是先從對象數組中選出最小的放在第一個位置,再從剩下的元素中選

排序 C++實現

logs pso int brush -- cpp end tac 排序 #include<iostream> #include<vector> #include<stack> #include<algorithm> #in

基數排序c++實現

復雜 -- cpp ++ stream c++實現 sin logs 中心 //中心思想,按照低位先排序,然後收集,再按照高位排序,然後再收集, //以此類推,直到最高位,是穩定算法,效率很高,復雜度是O(n㏒(r)m),r為采取的基數 //m為堆數,但是只能用在整數中,

選擇排序python實現

use 找到 ive eclipse div RF 數據 pos 一個 選擇排序(Selection sort)是一種簡單直觀的排序算法。它的工作原理是每一次從待排序的數據元素中選出最小(或最大)的一個元素,存放在序列的起始位置,直到全部待排序的數據元素排完。註意每次查找

python 選擇排序實現

def 我們 turn 如果 選擇排序的實現 spa ret return 依次 基本思想:從未排序的序列中找到一個最小的元素,放到第一位,再從剩余未排序的序列中找到最小的元素,放到第二位,依此類推,直到所有元素都已排序完畢。假設序列元素總共n+1個,則我們需要找n輪,就可

氣泡排序選擇排序實現與分析

氣泡排序與選擇排序是兩種非常基礎的排序方式,也是許多程式設計師入門的排序演算法。很多資料結構或者演算法教材清晰明瞭地描述了兩種排序的工作原理,複雜度等,但紙上得來終覺淺,為了摸清楚兩種演算法的效能,我還是親自動手操作了一波~~~ 下面請跟上我的思路~~~ 氣泡排序作為最最基礎的排序方法,應該

簡單選擇排序 java實現

簡單選擇排序 基本思想:在要排序的一組數中,選出最小的一個數與第一個位置的數交換;然後在剩下的數當中再找最小的與第二個位置的數交換,如此迴圈到倒數第二個數和最後一個數比較為止。 程式碼實現如下 public class SimpleSelectSort { publi

選擇排序--php實現

原理:每一次從待排序的資料元素中選出最小(或最大)的一個元素,存放在序列的起始位置,直到全部待排序的資料元素排完.。 <?php /** * 選擇排序 * 資料結構----------------陣列 * 最差時間複雜度-----------O(n^2) * 最優時間複雜度

1045 快速排序——c實現

1045 快速排序 (25 分) 著名的快速排序演算法裡有一個經典的劃分過程:我們通常採用某種方法取一個元素作為主元,通過交換,把比主元小的元素放到它的左邊,比主元大的元素放到它的右邊。 給定劃分後的 N 個互不相同的正整數的排列,請問有多少個元素可能是劃分前選取的主元? 例

09_資料結構與演算法_選擇排序_Python實現

""" 選擇排序: 思路: 遍歷整個列表,找到最小項的位置。 如果該位置不是列表的第一個位置,演算法就會交換這兩個位置的項; 然後演算法回到第二個位置並重復這個過程 """ import random #定義一個交換函式 d

選擇排序簡單實現和複雜度估計

選擇排序 1.每一次從待排序的資料元素中選出最小(或最大)的一個元素,存放在 序列的起始位置,直到全部待排序的資料元素排完。 簡單實現 public class SelectionSort { /** * * @param arr 傳入需要排序的陣列

選擇排序java實現

package algorithm; public class SelectSort { public static void main(String[] args) { int[] a = {6,2,5,4,7,1,3,9,8}; selectSort(a, a