選擇排序

基本思想:

在要排序的一組數(shù)中蛀序,選出最小(或者最大)的一個數(shù)與第1個位置的數(shù)交換徐裸;然后在剩下的數(shù)當中再找最小(或者最大)的與第2個位置的數(shù)交換譬正,依次類推檬姥,直到第n-1個元素(倒數(shù)第二個數(shù))和第n個元素(最后一個數(shù))比較為止粉怕。

簡單選擇排序示例

初始值: 3  1  5  7  2  4  9  6
第一趟: 1  3  5  7  2  4  9  6
第二趟: 1  2  5  7  3  4  9  6
第三趟: 1  2  3  7  5  4  9  6
第四趟: 1  2  3  4  5  7  9  6
第五趟: 1  2  3  4  5  7  9  6
第六趟: 1  2  3  4  5  6  9  7
第七趟: 1  2  3  4  5  6  7  9
第八趟: 1  2  3  4  5  6  7  9

操作方法:

第一趟,從n 個記錄中找出關鍵碼最小的記錄與第一個記錄交換贫贝;

第二趟蛉谜,從第二個記錄開始的n-1 個記錄中再選出關鍵碼最小的記錄與第二個記錄交換崇堵;

......

第 i 趟,則從第 i 個記錄開始的 n-i+1 個記錄中選出關鍵碼最小的記錄與第 i 個記錄交換狰贯,直到整個序列按關鍵碼有序赏廓。

算法的實現(xiàn):

// 輸出數(shù)組內容
void print(int array[], int length, int i) {
    printf("i=%d:",i);
    for (int j = 0; j < length; j++) {
        printf(" %d ", array[j]);
    }
    printf("\n");
}

// 獲取數(shù)組最小值下標
int SelectMinKey(int array[], int length, int i) {
    int k = i;
    for (int j = i + 1; j < length; j ++) {
        if (array[k] > array[j]) {
            k = j;
        }
    }
    return k;
}

// 簡單選擇排序(Simple Selection Sort)
void SelectSort(int array[], int length) {
    int key, temp;
    for (int i = 0; i < length; i ++) {
        key = SelectMinKey(array, length, i); // 獲取最小元素的下標
        if (key != i) { // 最小元素與第i位置元素交換
            temp = array[i];
            array[i] = array[key];
            array[key] = temp;
        }
        print(array, length, i);
    }
}

int main(int argc, const char * argv[]) {
    int arraySelectSort[8] = { 3, 1, 5, 7, 2, 4, 9, 6 };
    SelectSort(arraySelectSort, 8);
    printf("\n");

    return 0;
}

算法的改進(二元選擇排序)

簡單選擇排序,每趟循環(huán)只能確定一個元素排序后的定位摸柄。我們可以考慮改進為每趟循環(huán)確定兩個元素(當前趟最大和最小記錄)的位置,從而減少排序所需的循環(huán)次數(shù)既忆。改進后對n個數(shù)據(jù)進行排序,最多只需進行[n/2]趟循環(huán)即可患雇。具體實現(xiàn)如下:

// 二元選擇排序
void SelectSort2(int array[], int length) {
    int i, j, min, max;
    for (i = 0; i < length / 2; i ++) { // i 跑 n / 2 趟排序就會排序完成
        min = max = i; // 先將 min 和 max 都指向待排序的第一個元素
        for(j = i; j < length - i; j ++) {
            if (array[j] < array[min]) {
                min = j;
                continue;
            }
            if (array[j] > array[max]) {
                max = j;
            }
        }

        // 將最小值放在第i處,將最大值放在第length-i-1處
        // 注意:這里不能把 array[max]匾乓、array[min] 直接和 array[i] 和 array[length-i-1]調換
        int maxtemp = array[max];
        int mintemp = array[min];
        array[max] = array[length-i-1];
        array[min] = array[i];
        array[i] = mintemp;
        array[length-i-1] = maxtemp;

        print(array, 8, i);
    }
}

總結

在簡單選擇排序過程中又谋,所需移動記錄的次數(shù)比較少。最好情況下彰亥,即待排序記錄初始狀態(tài)就已經是正序排列了,則不需要移動記錄继阻。

最壞情況下废酷,即待排序記錄初始狀態(tài)是按第一條記錄最大,之后的記錄從小到大順序排列澈蟆,則需要移動記錄的次數(shù)最多為3(n-1)。簡單選擇排序過程中需要進行的比較次數(shù)與初始狀態(tài)下待排序的記錄序列的排列情況無關趴俘。當i=1時睹簇,需進行n-1次比較;當i=2時磨淌,需進行n-2次比較凿渊;依次類推,共需要進行的比較次數(shù)是(n-1)+(n-2)+…+2+1=n(n-1)/2嗽元,即進行比較操作的時間復雜度為O(n^2),進行移動操作的時間復雜度為O(n)淤翔。

簡單選擇排序是不穩(wěn)定排序。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末旁壮,一起剝皮案震驚了整個濱河市谐檀,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌麦撵,老刑警劉巖溃肪,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異惫撰,居然都是意外死亡,警方通過查閱死者的電腦和手機扼雏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門夯膀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人诱建,你說我怎么就攤上這事±恚” “怎么了辜荠?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長造烁。 經常有香客問我午笛,道長惭蟋,這世上最難降的妖魔是什么药磺? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任癌佩,我火速辦了婚禮木缝,結果婚禮上围辙,老公的妹妹穿的比我還像新娘。我一直安慰自己矫俺,他們只是感情好,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布厘托。 她就那樣靜靜地躺著贩虾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪伊群。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天舰始,我揣著相機與錄音咽袜,去河邊找鬼。 笑死询刹,一個胖子當著我的面吹牛萎坷,可吹牛的內容都是我干的沐兰。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼瓜浸,長吁一口氣:“原來是場噩夢啊……” “哼比原!你這毒婦竟也來了?” 一聲冷哼從身側響起量窘,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎谢床,沒想到半個月后厘线,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡造壮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年耳璧,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片旨枯。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖皂贩,靈堂內的尸體忽然破棺而出昆汹,到底是詐尸還是另有隱情明刷,我是刑警寧澤满粗,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站挤聘,受9級特大地震影響,放射性物質發(fā)生泄漏组去。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望贤旷。 院中可真熱鬧,春花似錦幼驶、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至假残,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間辉懒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工莹汤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留颠印,地道東北人纲岭。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓嗽仪,卻偏偏與公主長得像,于是被迫代替她去往敵國和親沽翔。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354