選擇排序,從字面上來說,就是要把一組數列中的元素給選擇出來。
比方說給定一組數列,要求把其中的元素進行從小到大排序,那麼只需要在進行每次排序的時候,都把最小的元素給選擇出來,放在數列的第一位即可,第二次排序第三次排序同理,把後面數列中的最小元素給選擇出來,放在已經排序好的元素的末尾,直到最後需要排序的元素沒有為止。
這裡有幾個注意點:
1、第一次排序是遍歷整個數列,把最小的元素給選擇出來放在第一位。
2、第二次排序開始是遍歷除了第一個元素外的後面的數列,把後面數列當中最小的元素給選擇出來放到第一個元素後面一位。
3、第三次排序同理,直到最後一次排序把整個數列以從小到大的方式打印出來。

可以發現,在進行選擇排序的過程中,每次最為重要的就是選擇出一個最小的元素然後進行排序。
理清邏輯,畫好流程圖
為了讓整個流程更加清晰,我畫了一張流程圖,也能在以後來幫助自己理解。

這裡最容易搞混的地方,我在自己寫代碼理邏輯的時候也容易出現問題,那就是這個交換位置到底應該放在哪邊,所以,為了講的更清楚一些,我打算用實際例子來舉例一下。
外循環是遍曆數組中所有的元素,內循環是遍歷除了當前元素的所有元素,然後要進行一個條件判斷,也就是找出最小的元素,之後與當前元素交換位置。
那麼內循環進行遍歷的時候,可能會遍歷到許多個比當前元素要小的元素,如果在這裡進行位置交換,那豈不是就會交換好多次,與我們期望的不符,所以交換位置不能放在內循環里。
所以邏輯應該改為:在進行完內循環後,把最小元素給選擇出來,然後再交換位置。
代碼實現:
//選擇排序
#include<stdio.h>
int main() {
int Select[9] = {100, 3, 7, 6, 55, 29, 33, 10, -12};
int Temp = 0;
int index = 0;
for(int i = 0; i < 9; i++){
index = i;
for(int j = i+1; j<9;j++){
if(Select[j]<Select[index]){
index = j;
}
}
Temp = Select[i];
Select[i] = Select[index];
Select[index] = Temp;
for(int i = 0; i < 9; i++){
printf("%d ", Select[i]);
}
printf("n");
}
}
大家可以看到,交換位置的邏輯與冒泡排序和直接插入排序交換位置的邏輯並無多大差別,無非這裡要進行交換位置的時候必須得把最小元素給選擇出來再交換位置,而不是找到一個最小元素就直接交換位置。
測試結果

總結
總的來說,選擇排序其實難度不大,但是如果剛開始學習數據結構的話,的確會有些不清楚,最重要的就是要理清邏輯,理清邏輯之後,因為內循環的主要目的是找到最小元素,如果在內循環中交換位置的話,那就沒有意義了,所以要在內循環外交換位置。
總的來說,難度不大,測試結果也與我們最終期望得到的結果相同。
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/252783.html