交换法与选择法降序排序
交换法
交换法对数组数组进行排序的基本思路 就是先让数组(n个数)中的最左边的一个数(用i=0代表)与其右边的每一个数(从j=i+1开始)依次(j++)进行比较,若遇到比其大的数(score[j]>score[i]),则将较大的那个数的值赋给自己,自己成为较大数继续与后面的数比较,以此类推,一轮后(即j=n时),让i自增1,重复上述循环直至i=n-1.
下面以一个有5个数的数组演示交换法排序:
#include <stdio.h>
void main()
{
int i,j,temp;
int score[5]={10,20,30,40,50};
int n=5;
for (i=0;i<=n-1;i++)
{
for (j=i+1;j<=n;j++)
{
if(score[j]>score[i])
{
temp=score[j];
score[j]=score[i];
score[i]=temp;
}
}
}
for(i=0;i<=n-1;i++)
{
printf("score[%d]= %d\n",i,score[i]);
}
}
选择法
选择法基本思路与交换法大致相似,不同点是交换法在一轮中要比较交换多次,而选择法是一轮中比较多次,而最多交换一次。选择法也是从i=0开始比较,遇到较大的数(score[j]>score[k](k在一开始是等于i的))则交换下标,最后若k 不等于i,则score[k]与score[i]交换位置。
同样以上述的数组用选择法来排序:
#include <stdio.h>
void main()
{
int i,j,temp,k;
int score[5]={10,20,30,40,50};
int n=5;
for (i=0;i<=n-1;i++)
{
k=i;
for (j=i+1;j<=n;j++)
{
if (score[j]>score[k])
{
k=j;
}
}
if (k!=i)
{
temp=score[k];
score[k]=score[i];
score[i]=temp;
}
}
for(i=0;i<=n-1;i++)
{
printf("score[%d]= %d\n",i,score[i]);
}
}
总结
选择法建立在交换法之上,但因交换次数较少,故效率较高