選擇排序算法

選擇排序(Selection Sort)算法也是比較簡(jiǎn)單的排序算法骤菠,其思路比較直觀。選擇排序算法在每一步中選取最小值來重新排序,從而達(dá)到排序的目的积仗。

選擇排序算法

選擇排序算法通過選擇和交換來實(shí)現(xiàn)排序,其排序流程如下:

⑴首先從原始數(shù)組中選擇最小的1個(gè)數(shù)據(jù)蜕猫,將其和位于第1個(gè)位置的數(shù)據(jù)交換寂曹。

⑵接下來從剩下的n-1個(gè)數(shù)據(jù)中選擇次小的1個(gè)數(shù)據(jù),將其和第2個(gè)位置的數(shù)據(jù)交換回右。

⑶然后不斷重復(fù)上訴過程隆圆,直到最后兩個(gè)數(shù)據(jù)完成交換。至此翔烁,便完成了對(duì)原始數(shù)組的從小到大的排序渺氧。

為了更好地理解選擇排序算法的執(zhí)行過程,下面舉一個(gè)實(shí)際數(shù)據(jù)的例子來一步一步地執(zhí)行選擇排序算法蹬屹。5個(gè)整型數(shù)據(jù)118侣背、101、105哩治、127秃踩、112是一組無序的數(shù)據(jù)。對(duì)其執(zhí)行選擇排序過程业筏,如圖1所示憔杨。

選擇排序算法的執(zhí)行步驟如下:

⑴第一次排序,從原始數(shù)組中選擇最小的數(shù)據(jù)蒜胖,這個(gè)數(shù)據(jù)便是101消别,將其與第1個(gè)數(shù)據(jù)118進(jìn)行交換。此時(shí)排序后的數(shù)據(jù)為101台谢,118寻狂,105,127朋沮,112蛇券。

⑵第二次排序,從剩余的數(shù)組中選擇最小的數(shù)據(jù),這個(gè)數(shù)據(jù)便是105纠亚,將其與第2個(gè)數(shù)據(jù)118進(jìn)行交換塘慕。此時(shí)排序后的數(shù)據(jù)為101、105蒂胞、118图呢、127、112骗随。

⑶第三次排序蛤织,從剩余的數(shù)組中選擇最小的數(shù)據(jù),這個(gè)數(shù)據(jù)便是112鸿染,將其與第3個(gè)數(shù)據(jù)118進(jìn)行交換指蚜。此時(shí)排序后的數(shù)據(jù)為101、105牡昆、112姚炕、127、118丢烘。

⑷第四次排序,從剩余的數(shù)組中選擇最小的數(shù)據(jù)些椒,這個(gè)數(shù)據(jù)便是118播瞳,將其與第4個(gè)數(shù)據(jù)127進(jìn)行交換。此時(shí)排序后的數(shù)據(jù)為101免糕、105赢乓、112、127石窑、118牌芋。

從上面的例子可以非常直觀的了解到選擇排序算法的執(zhí)行過程。選擇排序算法在對(duì)n個(gè)數(shù)據(jù)進(jìn)行排序時(shí)松逊,無論袁術(shù)就有無順序躺屁,都需要進(jìn)行n-1步的中間排序。這種排序方法思路很簡(jiǎn)單直觀经宏,但是缺點(diǎn)是執(zhí)行的步驟稍長(zhǎng)犀暑,效率不高。

選擇排序算法的示例代碼如下:

void selectSort(int[] a) {

int index;

int temp;

for (int i = 0; i < a.length - 1; i++) {

index = i;

for (int j = i + 1; j < a.length; j++) {

if (a[j] < a[index]) {

index = j;

}

}

if (index != i) {

temp = a[i];

a[i] = a[index];

a[index] = temp;

}

System.out.print("第" + (i + 1) + "步排序結(jié)果:"); // 輸出每步排序的結(jié)果

for (int h = 0; h < a.length; h++) {

System.out.print(" " + a[h]);

}

System.out.println("\n");

}

}

在上述代碼中烁兰,輸入?yún)?shù)a一般為一個(gè)數(shù)組的首地址耐亏。待排序的原數(shù)據(jù)便保存在數(shù)組a中,程序中通過兩層循環(huán)來對(duì)數(shù)據(jù)進(jìn)行排序沪斟」愠剑可以結(jié)合前面的選擇排序算法來加深理解。為了更清楚排序算法的執(zhí)行過程,在排序的每一步都輸出了當(dāng)前的排序結(jié)果择吊。

選擇排序算法實(shí)例

學(xué)習(xí)了前面的選擇排序算法的基本思想和算法之后李根,下面通過一個(gè)完整的例子來說明選擇排序法在整型數(shù)組排序中的應(yīng)用,程序示例如下:

【程序】

public class SelectionSort {

static final int SIZE = 10;

public static void selectSort(int[] a) {

int index, temp;

for (int i = 0; i < a.length - 1; i++) {

index = i;

for (int j = i + 1; j < a.length; j++) {

if (a[j] < a[index]) {

index = j;

}

}

if (index != i) {

temp = a[i];

a[i] = a[index];

a[index] = temp;

}

System.out.print("第" + (i + 1) + "步排序結(jié)果:"); // 輸出每步排序的結(jié)果

for (int h = 0; h < a.length; h++) {

System.out.print(" " + a[h]);

}

System.out.println("\n");

}

}

public static void main(String[] args) {

int[] shuzu = new int[SIZE];

int i;

for (i = 0; i < SIZE; i++) {

shuzu[i] = (int) (100 + Math.random() * (100 + 1));

}

System.out.print("排序前的數(shù)組為: \n");

for (i = 0; i < SIZE; i++) {

System.out.print(shuzu[i] + " ");

}

System.out.print("\n");

selectSort(shuzu);

System.out.print("排序后的數(shù)組為: \n");

for (i = 0; i < SIZE; i++) {

System.out.print(shuzu[i] + " ");

}

System.out.print("\n");

}

}

在上訴代碼中干发,程序定義了符號(hào)常量SIZE朱巨,用于表征需要排序整型數(shù)組的大小。在主方法中枉长,首先聲明一個(gè)整型數(shù)組冀续,然后對(duì)數(shù)組進(jìn)行隨機(jī)初始化,并輸出排序前的數(shù)組內(nèi)用必峰。接著洪唐,調(diào)用選擇排序算法方法來對(duì)數(shù)組進(jìn)行排序。最后吼蚁,輸出排序后的數(shù)組凭需。

該程序的執(zhí)行結(jié)果,如圖2所示肝匆。圖中顯示了每一步排序的中間結(jié)果粒蜈。


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市旗国,隨后出現(xiàn)的幾起案子枯怖,更是在濱河造成了極大的恐慌,老刑警劉巖能曾,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件度硝,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡寿冕,警方通過查閱死者的電腦和手機(jī)蕊程,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來驼唱,“玉大人藻茂,你說我怎么就攤上這事∈镎簦” “怎么了捌治?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)纽窟。 經(jīng)常有香客問我肖油,道長(zhǎng),這世上最難降的妖魔是什么臂港? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任森枪,我火速辦了婚禮视搏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘县袱。我一直安慰自己浑娜,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布式散。 她就那樣靜靜地躺著筋遭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪暴拄。 梳的紋絲不亂的頭發(fā)上漓滔,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音乖篷,去河邊找鬼响驴。 笑死,一個(gè)胖子當(dāng)著我的面吹牛撕蔼,可吹牛的內(nèi)容都是我干的豁鲤。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼鲸沮,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼琳骡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起讼溺,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤日熬,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后肾胯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡耘纱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年敬肚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片束析。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡艳馒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出员寇,到底是詐尸還是另有隱情弄慰,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布蝶锋,位于F島的核電站陆爽,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏扳缕。R本人自食惡果不足惜慌闭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一别威、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧驴剔,春花似錦省古、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至布讹,卻和暖如春琳拭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背炒事。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工臀栈, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人挠乳。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓权薯,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親睡扬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子盟蚣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

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

  • 【程序1】 題目:古典問題:有一對(duì)兔子,從出生后第3個(gè)月起每個(gè)月都生一對(duì)兔子卖怜,小兔子長(zhǎng)到第三個(gè)月后每個(gè)月又生一對(duì)兔...
    開心的鑼鼓閱讀 3,307評(píng)論 0 9
  • Java經(jīng)典問題算法大全 /*【程序1】 題目:古典問題:有一對(duì)兔子屎开,從出生后第3個(gè)月起每個(gè)月都生一對(duì)兔子,小兔子...
    趙宇_阿特奇閱讀 1,844評(píng)論 0 2
  • 回溯算法 回溯法:也稱為試探法马靠,它并不考慮問題規(guī)模的大小奄抽,而是從問題的最明顯的最小規(guī)模開始逐步求解出可能的答案,并...
    fredal閱讀 13,626評(píng)論 0 89
  • /*【程序21】 * 作者 南楓題目:求1+2!+3!+...+20!的和 1. 程序分析:此程序只是把累加變成了...
    HUC南楓閱讀 430評(píng)論 0 0
  • 噢甩鳄!噢逞度!人走了,雨還在下妙啃,但是档泽,人走了,傘卻留給了我揖赴。 這也就是我每年在春風(fēng)吹過的時(shí)候馆匿,總不會(huì)認(rèn)為是春天真正地到來...
    無忌西東7閱讀 246評(píng)論 0 10