算法(一)之排序算法(二)——選擇排序(SelectSort)

選擇排序是八大排序算法之一趾代,其排序原理是:

比如在一個長度為N的無序數(shù)組中稽坤,在第一趟遍歷N個數(shù)據(jù)糯俗,找出其中最小的數(shù)值與第一個元素交換其數(shù)據(jù)的索引位置,第二趟遍歷剩下的N-1個數(shù)據(jù)杖玲,找出其中最小的數(shù)值與第二個元素交換......第N-1趟遍歷剩下的2個數(shù)據(jù)淘正,找出其中最小的數(shù)值與第N-1個元素交換,至此選擇排序完成囤采。選擇排序與冒泡排序有點(diǎn)不同的是蕉毯,選擇排序是先交換下標(biāo),然后在交換數(shù)值进肯。用文字?jǐn)⑹鍪侵v不清楚的棉磨,還是通過流程來分析吧乘瓤。

如現(xiàn)在有一組數(shù)據(jù):[3, 1, 8, 6, 2, 5, 9, 4, 7]

使用選擇排序?qū)@組數(shù)據(jù)進(jìn)行排序,具體流程:

第一趟排序: 定義一個下標(biāo) int index = 0; 即先指向第一個數(shù)3抬吟,感嘆號代表下標(biāo)差油。

       3    1    8    6    2    5    9    4    7
       !

(1) 把index指向的數(shù)和下標(biāo)從1開始往后面依次遍歷的數(shù)字進(jìn)行比較蓄喇,如果有數(shù)字比index指向的數(shù)小,則把那個數(shù)的下標(biāo)賦值給index刃鳄。即3>1,1的下標(biāo)是1钱骂,所以index=1; 這時(shí)候下標(biāo)index指向下標(biāo)就是1。

       3    1    8    6    2    5    9    4    7
            !

(2) 把index指向的數(shù)和下標(biāo)從2開始往后面依次遍歷的數(shù)字進(jìn)行比較愉烙,如果有數(shù)字比index指向的數(shù)小解取,則把那個數(shù)的下標(biāo)賦值給index。后面的數(shù)字都比1大蔓肯,這時(shí)候下標(biāo)index指向的下標(biāo)還是1蔗包。

       3    1    8    6    2    5    9    4    7
            !

.............繼續(xù)上面的步驟把循環(huán)走完,一直走到下標(biāo)從8開始往后面依次遍歷的數(shù)字進(jìn)行比較的時(shí)候舟陆,發(fā)現(xiàn)還是沒有數(shù)字比index 1指向的數(shù)字1小吨娜,那就退出了循環(huán)淘钟,開始進(jìn)行數(shù)字的交換陪毡。

        1    3    8    6    2    5    9    4    7    第一趟排序的結(jié)果

把第一個數(shù)和下標(biāo)為index的數(shù)進(jìn)行交換毡琉,這樣一來就相當(dāng)于把最小的數(shù)找到了并且放在第一位,接下來我們只需要對后面的8個數(shù)進(jìn)行排序即可慧耍。


第二趟排序:定義一個下標(biāo) int index = 1; 即先指向第二個數(shù)3丐谋,感嘆號代表下標(biāo)号俐。

        1    3    8    6    2    5    9    4    7
             !

(1)把index指向的數(shù)和從下標(biāo)為2開始的往后面依次遍歷的數(shù)字進(jìn)行比較,如果有數(shù)字比index指向的數(shù)小踪危,則把那個數(shù)的下標(biāo)賦值給index猪落。即3>2, 2的下標(biāo)是4笨忌,所以 index = 4; 這時(shí)候下標(biāo)index指向下標(biāo)就是4。

        1    3    8    6    2    5    9    4    7
                            !

(2)把index指向的數(shù)和從下標(biāo)為3開始的往后面依次遍歷的數(shù)字進(jìn)行比較杂曲,如果有數(shù)字比index指向的數(shù)小,則把那個數(shù)的下標(biāo)賦值給index咱揍。后面的數(shù)字都比2大棚饵,這時(shí)候下標(biāo)index指向的下標(biāo)還是4噪漾。

        1    3    8    6    2    5    9    4    7
                            !

.............繼續(xù)上面的步驟把循環(huán)走完,一直走到下標(biāo)從8開始往后面依次遍歷的數(shù)字進(jìn)行比較的時(shí)候题翰,發(fā)現(xiàn)還是沒有數(shù)字比index 4指向的數(shù)字2小诈胜,那就退出了循環(huán)焦匈,開始進(jìn)行數(shù)字的交換。

        1    2    8    6    3    5    9    4    7    第二趟排序的結(jié)果

第三趟排序:定義一個下標(biāo) int index = 2; 即先指向第三個數(shù)8累魔,感嘆號代表下標(biāo)垦写。

        1    2    8    6    3    5    9    4    7
                  !

(1)把index指向的數(shù)和從下標(biāo)為3開始的往后面依次遍歷的數(shù)字進(jìn)行比較版述,如果有數(shù)字比index指向的數(shù)小,則把那個數(shù)的下標(biāo)賦值給index晚伙。即8>6, 6的下標(biāo)是3俭茧,所以 index = 3; 這時(shí)候下標(biāo)index指向下標(biāo)就是3母债。

        1    2    8    6    3    5    9    4    7
                       !

(2)把index指向的數(shù)和從下標(biāo)為4開始的往后面依次遍歷的數(shù)字進(jìn)行比較尝抖,如果有數(shù)字比index指向的數(shù)小昧辽,則把那個數(shù)的下標(biāo)賦值給index登颓。即6>3, 3的下標(biāo)是4,所以 index = 4; 這時(shí)候下標(biāo)index指向下標(biāo)就是4框咙。

        1    2    8    6    3    5    9    4    7
                            !

(3)把index指向的數(shù)和從下標(biāo)為5開始的往后面依次遍歷的數(shù)字進(jìn)行比較喇嘱,如果有數(shù)字比index指向的數(shù)小茉贡,則把那個數(shù)的下標(biāo)賦值給index。后面的數(shù)字都比3大者铜,這時(shí)候下標(biāo)index指向的下標(biāo)還是4腔丧。

.............繼續(xù)上面的步驟把循環(huán)走完,一直走到下標(biāo)從8開始往后面依次遍歷的數(shù)字進(jìn)行比較的時(shí)候王暗,發(fā)現(xiàn)還是沒有數(shù)字比index 4指向的數(shù)字3小悔据,那就退出了循環(huán)庄敛,開始進(jìn)行數(shù)字的交換俗壹。

        1    2    3    6    8    5    9    4    7      第三趟排序結(jié)果

根據(jù)這樣的流程一直循環(huán)下去,最終就會實(shí)現(xiàn)這樣的排序結(jié)果藻烤,后面的流程我就不繼續(xù)寫下去了绷雏。

直接上代碼:

        public static void selectSort(int[] array){
            for(int i = 0;i < array.length-1; i++){
                int index = i;
                for(int j = i+1;j < array.length; j++){
                    if(array[index] > array[j]){
                        index = j;    //說明找到了比Index小的數(shù)的下標(biāo)
                    }
                }

                if(index != i){    //如果最小的數(shù)位置發(fā)生了變化就交換
                    int temp = array[index];
                    array[index] = array[i];
                    array[i] = temp;
                }
            }
        }

選擇排序應(yīng)用場景:也是應(yīng)用在數(shù)據(jù)量小的情況下怖亭。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末涎显,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子兴猩,更是在濱河造成了極大的恐慌期吓,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件倾芝,死亡現(xiàn)場離奇詭異讨勤,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)晨另,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進(jìn)店門潭千,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人借尿,你說我怎么就攤上這事刨晴√肜矗” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵狈癞,是天一觀的道長茄靠。 經(jīng)常有香客問我,道長蝶桶,這世上最難降的妖魔是什么嘹黔? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮莫瞬,結(jié)果婚禮上儡蔓,老公的妹妹穿的比我還像新娘。我一直安慰自己疼邀,他們只是感情好喂江,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著旁振,像睡著了一般获询。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拐袜,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天吉嚣,我揣著相機(jī)與錄音,去河邊找鬼蹬铺。 笑死尝哆,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的甜攀。 我是一名探鬼主播秋泄,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼规阀!你這毒婦竟也來了恒序?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤谁撼,失蹤者是張志新(化名)和其女友劉穎歧胁,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體厉碟,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡喊巍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了墨榄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片玄糟。...
    茶點(diǎn)故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖袄秩,靈堂內(nèi)的尸體忽然破棺而出阵翎,到底是詐尸還是另有隱情逢并,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布郭卫,位于F島的核電站砍聊,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏贰军。R本人自食惡果不足惜玻蝌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望词疼。 院中可真熱鬧俯树,春花似錦、人聲如沸贰盗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽舵盈。三九已至陋率,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間秽晚,已是汗流浹背瓦糟。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赴蝇,地道東北人菩浙。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像扯再,于是被迫代替她去往敵國和親芍耘。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評論 2 354

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

  • 第一章 緒論 什么是數(shù)據(jù)結(jié)構(gòu)熄阻? 數(shù)據(jù)結(jié)構(gòu)的定義:數(shù)據(jù)結(jié)構(gòu)是相互之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素的集合。 第二章...
    SeanCheney閱讀 5,771評論 0 19
  • 1倔约、常用排序算法 2位衩、快速排序法 基本思想:通過一趟排序?qū)⒁判虻臄?shù)據(jù)分割成獨(dú)立的兩部分秩仆,其中一部分的所有數(shù)據(jù)都比...
    Bling_ll閱讀 548評論 0 0
  • 概述 排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大顶岸,一次不能容納全部...
    蟻前閱讀 5,184評論 0 52
  • 個人介紹及問題解決 BubbleSort(冒泡排序) 定義:在同一個數(shù)組中,從數(shù)組第一個數(shù)開始诵盼,相鄰兩個數(shù)進(jìn)行比較...
    Juinjonn閱讀 10,105評論 6 179
  • 我希望 不管以后我們怎么樣 我希望在老了之后會記得你我二十來歲的日子里 深愛著彼此重罪。 有這么一個人 陪伴著 走過最...
    愿這世界如童話閱讀 183評論 1 1