思想: 把要排序的序列分爲兩個序列,分別是有序序列和無序序列。一開始,因爲還沒有進行排序,所以整個序列都是無序的,所以有序序列爲空,然後以升序爲例,進行一次循環,挑出最小的數,放到無序序列的最前邊,然後進行一次劃分,將剛選出的這個數當做有序序列,剩下的數當做現有的無序序列,再進行循環挑出最小的數,放到最前邊,再歸類成有序序列的一部分,現在有序序列有兩個數,剩下的所有數都是無序序列的,就這樣進行一次一次的選擇,挑出最小的數,放到有序序列裏。拿圖來說:
優化: 前邊說道,每次選一個最小的數出來,放在序列的開頭,但是這樣感覺糟蹋了一次循環啊!因爲我們同時還可以選出來一個最大的數放在序列的末尾!
那麼看代碼:
void SelecSort(int *a,int n) {
int begin = 0;
int end = n - 1;
while (begin<end) {
int mini = begin, maxi = end;
for (int i = begin; i < end; ++i) {
if (a[maxi] < a[i])
maxi = i;
if (a[mini] > a[i])
mini = i;
}
if (begin == maxi) // 這裏爲什麼要加個判斷呢?且聽我給你細細分析。
maxi = mini;
Swap(&a[mini], &a[begin]);
Swap(&a[maxi], &a[end]);
++begin;
--end;
}
}