直接選擇排序
數組分成有序區和無序區,初始時整個數組都是無序區,然后每次從無序區選一個最小的元素直接放到有序區的最后,直到整個數組變有序區。
選擇排序的步驟是這樣的:
首先,找到數組中最小的元素,將它和數組的第一個元素交換位置。
第二步,在剩下的元素中繼續尋找最小的元素,和數組的第二個元素交換位置。
如此循環,直到整個數組排序完成。
#include <stdio.h> int main () { int list[15] = {5,23,86,21,43,67,45,34,58,23,102,123,11,22,1}; int i, j, temp,min; for(i = 0; i< 15;i++) { //令最小值等於無序區的第一個值 min = list[i]; temp = i; //找到無序區的最小值 for(j = i; j<15;j++) { if(min>list[j]) { temp = j; min = list[j]; } } //交換 list[temp] = list[i]; list[i] = min; temp = 0; } for (i = 0;i < 15; i++) printf("%d\n",list[i]); }
圖解選擇排序
我們以[ 8,2,5,9,7 ]這組數字做例子。
第一次選擇,先找到數組中最小的數字 2 ,然后和第一個數字交換位置。(如果第一個數字就是最小值,那么自己和自己交換位置,也可以不做處理,就是一個 if 的事情)
第二次選擇,由於數組第一個位置已經是有序的,所以只需要查找剩余位置,找到其中最小的數字5,然后和數組第二個位置的元素交換。
第三次選擇,找到最小值 7 ,和第三個位置的元素交換位置。
第四次選擇,找到最小值8,和第四個位置的元素交換位置。
最后一個到達了數組末尾,沒有可對比的元素,結束選擇。
如此整個數組就排序完成了。