一、什么是選擇排序法:
對於一串數字:3、5、8、2、6、7、0、1,想要把這串數組按照從大到小的順序排列,這時候我們可以選擇選擇排序的算法。
首先:對於第一個位置上(進行選擇的位置)的數字,需要和后面的七個數字(進行比較的位置)進行比較,如果大於,則調換位置,第一輪,可以把最小的數字排到第一個位置上。
其次:對於第二個位置上的數字,需要和后面的六個數字進行比較,如果大於,則調換位置,第二輪,可以把次小的數字排到第二個位置上。
最后,只需要找到排在第七個位置上的數,這八個數字就從大到小拍好了。
因此我么需要進行七輪,第一輪是把第一個位置上的數和后面進行比較,第二輪是把第二個位置上的數和后面比較,以此類推......
而每一輪比較,都會分為幾個小的比較,第一個位置先和第二個位置比,再和第三個位置比.....
通過上面的分析,我們可以發現,這個算法需要一層循環嵌套,外層自然就是比較的輪數,內層是數字的位置(下標)
二、通過一個程序來理解:
//選擇排序法案例
#include <stdio.h>
int main(void)
{
int names[8]={3,5,8,2,6,7,0,1};//對這個數組中的元素進行排序
int dates[8];
for (int i=0;i<8;i++)
{
dates[i]=names[i];
}
int out_i;
int in_i;
for (out_i=0;out_i<7;out_i++)//out_i代表的是比較的輪數,同時也是所要進行選擇的位置。
{
for (in_i=out_i+1;in_i<8;in_i++)//in_i是進行比較的位置,這個位置負責和選擇的位置進行比較,這個位置最大是7
{
if (dates[out_i]>dates[in_i])//因為數組中的第一個位置是0位置。
{
int agent;
agent=dates[out_i];
dates[out_i]=dates[in_i];
dates[in_i]=agent;
}
}
}
printf("print the changed array :\n");
for (int n=0;n<8;n++)
{
printf("dates[%d]=%d\n",n,dates[n]);
}
printf("print the original array:\n");
for (int n=0;n<8;n++)
{
printf("names[%d]=%d\n",n,names[n]);
}
return 0;
}
運行結果如下:
print the changed array :
dates[0]=0
dates[1]=1
dates[2]=2
dates[3]=3
dates[4]=5
dates[5]=6
dates[6]=7
dates[7]=8
print the original array:
names[0]=3
names[1]=5
names[2]=8
names[3]=2
names[4]=6
names[5]=7
names[6]=0
names[7]=1