選擇排序的學習筆記

一、原理

把基本的排序算法簡略的看了一遍,可以說選擇排序也是最容易理解的一個了

舉個例子,如果有一個長度爲10的未排序的數組

我們第一次遍歷數組,找到這10個數中最小的數,與第一個數交換(如果第一個數就是最小的數,默認自己與自己交換)

而後,我們再遍歷一次除了第一個數以外的數,依舊找到這裏最小的數,與第二個數交換

這樣以此類推,我們就會得到一個排序好的數組

二、實現

其具體JAVA代碼如下:

        for (int i = 0; i < ints.length; i++) {
            int minIndex = i;
            for (int j = i; j < ints.length; j++) {
                if (ints[j] < ints[minIndex]) {
                    minIndex = j;
                }
            }
            int temp = ints[i];
            ints[i] = ints[minIndex];
            ints[minIndex] = temp;
        }

運行測試:

//最初的數據
215 | 365 | 511 | 158 | 586 | 724 | 548 | 931 | 951 | 784 | 
//從全部數組中找到最小的數,與第一位進行交換,可以看出array[3] 與 array[0]進行了交換
158 | 365 | 511 | 215 | 586 | 724 | 548 | 931 | 951 | 784 | 
//從除第一位外的數組中找到最小的數,與第二位進行交換,這裏array[3] 與 array[0]進行了交換
158 | 215 | 511 | 365 | 586 | 724 | 548 | 931 | 951 | 784 | 
//以此類推...
158 | 215 | 365 | 511 | 586 | 724 | 548 | 931 | 951 | 784 | 
158 | 215 | 365 | 511 | 586 | 724 | 548 | 931 | 951 | 784 | 
158 | 215 | 365 | 511 | 548 | 724 | 586 | 931 | 951 | 784 | 
158 | 215 | 365 | 511 | 548 | 586 | 724 | 931 | 951 | 784 | 
158 | 215 | 365 | 511 | 548 | 586 | 724 | 931 | 951 | 784 | 
158 | 215 | 365 | 511 | 548 | 586 | 724 | 784 | 951 | 931 | 
158 | 215 | 365 | 511 | 548 | 586 | 724 | 784 | 931 | 951 | 
//最終排序結果
158 | 215 | 365 | 511 | 548 | 586 | 724 | 784 | 931 | 951 | 

三、時間複雜度

從代碼上可以看出

選擇排序中比較所花費的次數大概是

N + (N - 1) + (N - 2) + ... + 2 + 1 ~ N^2 / 2

交換所花費的次數大概是 N 次

所以總次數大概爲 (N^2 + 2N ) / 2

所以時間複雜度爲O(n^2)

四、特點

1、交換次數較少,交換次數即爲數組長度

2、對輸入數組的形式沒有依賴,也就是說不論是已經排序好的數組,還是部分排序,還是完全混亂的數組,它的時間複雜度都是相同的,都回去遍歷相同數量的數組,時間較爲穩定

3、時間複雜度爲平方級,不適合大數量級的排序

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章