一、什么是选择排序法:
对于一串数字: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