算法之選擇排序

算法之選擇排序


  • 一:基本概念

    選擇排序(Select Sort)队丝,第1趟港准,在待排序記錄r[1]r[n]中選出最小的記錄,將它與r[1]交換抄瑟;第2趟凡泣,在待排序記錄r[2]r[n]中選出最小的記錄,將它與r[2]交換皮假;以此類推鞋拟,第i趟在待排序記錄r[i]r[n]中選出最小的記錄,將它與r[i]交換惹资,使有序序列不斷增長直到全部排序完畢贺纲。

  • 二:圖文說明

選擇排序示意圖.png
我們分析一下具體的排序步驟:
1. 我們先找到數(shù)列中最小的數(shù)字即16,我們需要將最小的排到第一位布轿,所以將第一位上的值21和16進(jìn)行交換哮笆;
2. 除過第一位元素,在后面的數(shù)列中找出最小的值放到第二位汰扭,即將21與25進(jìn)行交換稠肘;
3. 除過第一、第二位元素萝毛,在后面的數(shù)列中找出最小的值放到第三位项阴,即將25與49進(jìn)行交換;
4. 除過第一笆包、第二环揽、第三位元素,在后面的數(shù)列中找出最小的值放到第四位庵佣,因?yàn)?2是最小的值歉胶,剛好又在第四位上,所以不用交換巴粪;
5. 剩下的最后一位肯定就是最大的數(shù)通今,即數(shù)組排序完成!
  • 三:代碼實(shí)現(xiàn)

    1. C語言實(shí)現(xiàn)
    #include <stdio.h>
    /*
        選擇排序 
    */
    void show(int arr[],int len);//打印出數(shù)組 
    void swap(int arr[],int i,int j); //交換數(shù)組中的兩個(gè)位置 
    void selectSort(int arr[],int len); //選擇排序算法實(shí)現(xiàn) 
    
    int main(void)
    {
        int arr[] = {21, 25, 49, 32, 16};
        int len = sizeof(arr)/sizeof(*arr);
        printf("待排序數(shù)組為:\n");
        show(arr,len);
        selectSort(arr,len);
        printf("排序之后的數(shù)組為:\n");
        show(arr,len);
        return 0;
    }
    
    void show(int arr[],int len)
    {
        int i;
        for(i=0;i<len;i++)
        {
            printf("%d ",arr[i]);
        }
        printf("\n");
    }
    
    void swap(int arr[],int i,int j)
    {
        int temp;
        temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
    
    void selectSort(int arr[],int len)
    {
        int i,j;
        int k = -1;
        for(i=0; i<len;i++)
        {
            k = i;//存儲(chǔ)將要交換位置的下標(biāo)
            for(j=i;j<len;j++)//第一趟排序中的所有比較 
            {
                if(arr[j]<arr[k])
                {
                    k = j;
                }
            }
            swap(arr,i,k);
        }
    }
    

    2.JAVA實(shí)現(xiàn)

    package com.data;
    import java.util.Arrays;
    public class SelectSort {
        public static void main(String[] args) {  
            int a[] = {21, 25, 49, 32, 16};
            System.out.println("排序前的數(shù)組為:"+Arrays.toString(a));
            selectionSort(a);
            System.out.println("排序后的數(shù)組為:"+Arrays.toString(a)); 
        }  
        public static void selectionSort(int arr[]){  
            for(int i=0;i<arr.length;i++){ //遍歷整個(gè)數(shù)組  
                int minIndex=i;  //聲明最小值坐標(biāo)  
                for(int j=i+1;j<arr.length;j++){ //遍歷為交換的數(shù)組  
                    if(arr[minIndex]>arr[j]){ //拿當(dāng)前最小值跟為交換的數(shù)組對比  
                        minIndex=j;  
                    }  
                }  
                int conversion=arr[i]; //換位變量  
                arr[i]=arr[minIndex]; //交換位置  
                arr[minIndex]=conversion;  
            }  
              
        }  
    }
    
  • 四:選擇排序的時(shí)間復(fù)雜度和穩(wěn)定性

    1. 選擇排序的時(shí)間復(fù)雜度
    • 選擇排序的時(shí)間復(fù)雜度是O(N*N)肛根。
    1. 選擇排序穩(wěn)定性
    • 選擇排序即是給每個(gè)位置選擇待排序元素中當(dāng)前最小的元素辫塌。比如給第一個(gè)位置選擇最小的,在剩余元素里面給第二個(gè)位置選擇次小的派哲,依次類推臼氨,直到第n-1個(gè)元素,第n個(gè)元素不用選擇了芭届,因?yàn)橹皇O滤粋€(gè)最大的元素了储矩。那么感耙,在一趟選擇時(shí),如果當(dāng)前鎖定元素比后面一個(gè)元素大椰苟,而后面較小的那個(gè)元素又出現(xiàn)在一個(gè)與當(dāng)前鎖定元素相等的元素后面抑月,那么交換后位置順序顯然改變了。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末舆蝴,一起剝皮案震驚了整個(gè)濱河市谦絮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌洁仗,老刑警劉巖层皱,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異赠潦,居然都是意外死亡叫胖,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進(jìn)店門她奥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瓮增,“玉大人,你說我怎么就攤上這事哩俭”僚埽” “怎么了?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵凡资,是天一觀的道長砸捏。 經(jīng)常有香客問我,道長隙赁,這世上最難降的妖魔是什么垦藏? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮伞访,結(jié)果婚禮上掂骏,老公的妹妹穿的比我還像新娘。我一直安慰自己厚掷,他們只是感情好弟灼,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蝗肪,像睡著了一般袜爪。 火紅的嫁衣襯著肌膚如雪蠕趁。 梳的紋絲不亂的頭發(fā)上薛闪,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天,我揣著相機(jī)與錄音俺陋,去河邊找鬼豁延。 笑死昙篙,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的诱咏。 我是一名探鬼主播苔可,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼袋狞!你這毒婦竟也來了焚辅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤苟鸯,失蹤者是張志新(化名)和其女友劉穎同蜻,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體早处,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡湾蔓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了砌梆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片默责。...
    茶點(diǎn)故事閱讀 40,427評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖咸包,靈堂內(nèi)的尸體忽然破棺而出桃序,到底是詐尸還是另有隱情,我是刑警寧澤诉儒,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布葡缰,位于F島的核電站,受9級特大地震影響忱反,放射性物質(zhì)發(fā)生泄漏泛释。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一温算、第九天 我趴在偏房一處隱蔽的房頂上張望怜校。 院中可真熱鬧,春花似錦注竿、人聲如沸茄茁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽裙顽。三九已至,卻和暖如春宣谈,著一層夾襖步出監(jiān)牢的瞬間愈犹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留漩怎,地道東北人勋颖。 一個(gè)月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像勋锤,于是被迫代替她去往敵國和親饭玲。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評論 2 359

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