数组排序(交换法与选择法)

来源:互联网 发布:知乎 真名 编辑:程序博客网 时间:2024/06/06 03:04

交换法与选择法降序排序

交换法

交换法对数组数组进行排序的基本思路 就是先让数组(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]);    }}

总结

选择法建立在交换法之上,但因交换次数较少,故效率较高