排序:選擇排序(算法)

文 | 莫若吻


1.簡介

排序就是算法。
? 選擇排序(Selection sort)是一種簡單直觀的排序算法。

選擇排序是不穩(wěn)定的排序方法。
? eg:序列[9,9, 1]第一次就將第一個[9]與[1]交換,導(dǎo)致第一個9挪動到第二個9后面

Note:一般面試的時候才會用到選擇、冒泡排序。

2.原理

選擇排序的工作原理是**每一次從待排序的數(shù)據(jù)元素中選出最小(或最大)的一個元素,存放在序列的起始位置,直到全部待排序的數(shù)據(jù)元素排完。 **

3.原理過程圖

內(nèi)循環(huán)結(jié)束一次,最值出現(xiàn)頭角標(biāo)位置上。(原理過程如下圖)

Paste_Image.png

4.時間復(fù)雜度

簡單選擇排序的比較次數(shù)與序列的初始排序無關(guān)。 假設(shè)待排序的序列有 n 個元素,選擇排序的賦值操作介于 0 和 3 (n - 1) 次之間; 則比較次數(shù) 永遠(yuǎn)都是n (n- 1) / 2; 而移動次數(shù)(即:交換操作)與序列的初始排序有關(guān),介于 0 和 (n - 1) 次之間。當(dāng)序列正序時,移動次數(shù)最少,為 0。當(dāng)序列反序時,移動次數(shù)最多,為n - 1 次;逆序交換n/2次。綜上,簡單選擇排序的時間復(fù)雜度為 O(n2)
選擇排序的移動次數(shù)比冒泡排序少多了,由于交換所需CPU時間比 比較所需的CPU時間多,n值較小時,選擇排序比冒泡排序快

5.性能分析 (穩(wěn)定性)

選擇排序的時間復(fù)雜度為O(n2),由于每次選擇僅考慮某一位置上的數(shù)據(jù)情況,可能會破壞之前數(shù)據(jù)的相對位置,因此它是一種不穩(wěn)定的排序方法。

6.選擇排序有兩個重要特點(diǎn):

1)運(yùn)行時間和輸入無關(guān)

即不論數(shù)組的初始狀態(tài)的有序程度,選擇排序的比較次數(shù)都沒有變化。考慮到比較次數(shù)與元素個數(shù)的關(guān)系是n (n- 1)/ 2,所以當(dāng)一個已經(jīng)比較有序的數(shù)組使用選擇排序會很不劃算。

2)數(shù)據(jù)的移動操作最少

移動操作次數(shù)是一個常量,最多為n-1,其他的算法都不具備這個特征。

7.選擇排序與冒泡排序哪個效率更高?

選擇排序、冒泡排序都用for(for(if))結(jié)構(gòu)語句。一般選擇排序效率會更高一些。
自我總結(jié)分析原因:(更詳細(xì)情況請參考上面選擇排序的時間復(fù)雜度)
冒泡排序的思想為每一次排序過程,通過相鄰元素的交換,將當(dāng)前沒有排好序中的最大(小)移到數(shù)組的最右(左)端。而選擇排序的思想也很直觀:每一次排序過程,我們獲取當(dāng)前沒有排好序中的最大(小)的元素和數(shù)組最右(左)端的元素交換,循環(huán)這個過程即可實(shí)現(xiàn)對整個數(shù)組排序。
同樣數(shù)據(jù)的情況下,兩種算法的循環(huán)次數(shù)是一樣的,但選擇排序只有0到1次交換,而冒泡排序只有0到n次交換 。而影響我們算法效率的主要部分是循環(huán)和交換,顯然,次數(shù)越多,效率就越差。選擇排序的平均時間復(fù)雜度比冒泡排序的稍低。所以相比較而言選擇排序效率會更高一些。

8.示例代碼(Java)

對給指定數(shù)組進(jìn)行排序:{5,1,6,4,2,8,9}

核心代碼:

    /*
    選擇排序。
    內(nèi)循環(huán)結(jié)束一次,最值出現(xiàn)頭角標(biāo)位置上。
    */
    public static void selectSort(int[] arr)
    {
        for (int x=0; x<arr.length-1 ; x++)
        {
            for(int y=x+1; y<arr.length; y++)
            {
                if(arr[x]>arr[y])          //缺點(diǎn):性能低。
                {
                     int temp = arr[x];
                     arr[x] = arr[y];
                     arr[y] = temp;
                }
            }
        }
    }```  

__詳細(xì)代碼:__
? (注:大家可以自行運(yùn)行結(jié)果查看)

import java.util.*;
class ArraySort
{
public static void main(String[] args)
{
int[] arr = {5,1,6,4,2,8,9};
//排序前;
printArray(arr);

    //選擇排序
    selectSort(arr);

    //冒泡排序
    //bubbleSort(arr);
    
    //排序后:
    printArray(arr);

    //Arrays.sort(arr);  //java中已經(jīng)定義好的一種排序方式。開發(fā)中,對數(shù)組排序。要使用該句代碼。
}

/*
選擇排序。
內(nèi)循環(huán)結(jié)束一次,最值出現(xiàn)頭角標(biāo)位置上。
*/
public static void selectSort(int[] arr)
{
    for (int x=0; x<arr.length-1 ; x++)
    {
        for(int y=x+1; y<arr.length; y++)
        {
            if(arr[x]>arr[y])          //缺點(diǎn):性能低。
            {
                swap(arr,x,y); 
            }
        }
    }
}

/*
無論什么排序。都需要對滿足條件的元素進(jìn)行位置置換。
所以可以把這部分相同的代碼提取出來,單獨(dú)封裝成一個函數(shù)。
*/
public static void swap(int[] arr,int a,int b)
{
    int temp = arr[a];
    arr[a] = arr[b];
    arr[b] = temp;
}

/*
排序顯示格式
*/
public static void printArray(int[] arr)
{
    System.out.print("[");
    for(int x=0; x<arr.length; x++)
    {
        if(x!=arr.length-1)
            System.out.print(arr[x]+", ");
        else
            System.out.println(arr[x]+"]");

    }       
}

}



<br/>
***
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請必須注明出處,謝謝!
<br/>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,316評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,481評論 3 415
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,241評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,939評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,697評論 6 409
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,182評論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,247評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,406評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,933評論 1 334
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,772評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,973評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,516評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,638評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,866評論 1 285
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,644評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,953評論 2 373

推薦閱讀更多精彩內(nèi)容

  • 概述 排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    蟻前閱讀 5,209評論 0 52
  • 概述:排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    每天刷兩次牙閱讀 3,738評論 0 15
  • 概述排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部的...
    Luc_閱讀 2,285評論 0 35
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 將一個記錄插入到已排序好...
    依依玖玥閱讀 1,265評論 0 2
  • 她和他的故事還在繼續(xù)。而我繼續(xù)傻逼。
    燃燒羊羊閱讀 159評論 0 1