11.3 选择法排序

选择法排序同样是一种相对较为简单和容易实现的排序方法,下面介绍这种排序的实现方法。首先同样需要确定排序的规则,然后以给定排序数组的第一个数为基准,将其后的数依次与其进行比较,根据排序规则来确定是否交换两个数。

在此同样以升序为例来讲解。

第一轮:以第一个数为基准,从第二个数开始,将后面的数据与第一个数一一进行对比,如果有比第一个数还小的,那么就将第一个数与该数进行交换,直到比较到最后一个数为止。

第二轮:由于第一轮比较结束后,第一个数是给定排序数中最小的数,因此第二轮以第二个数为基准,将其后的数依次与其进行比较操作,满足条件则进行交换,直到比较到最后一个数为止。

重复以上操作,直到以倒数第二个数为基准,进行最后一轮比较操作为止。分析下面的实现代码。


include<stdio.h>

void sort(int a[],int n)

{

int i,j,k,tmp;

for(i=0;i<n-1;i++)

{

k=i;

for(j=i+1;j<n;j++)

{

if(a[j]<a[k])

k=j;

}

if(k!=i)

{

tmp=a[i];

a[i]=a[k];

a[k]=tmp;

}

}

}

int main(void)

{

int i;

int a[5]={32,12,56,78,43};

printf("排序前\n");

for(i=0;i<5;i++)

printf("%d\t",a[i]);

sort(a,5);

printf("\n排序后\n");

for(i=0;i<5;i++)

printf("%d\t",a[i]);

return 0;

}


运行结果:


排序前

32 12 56 78 43

排序后

12 32 43 56 78


对比排序前后的打印结果发现,成功地实现了通过选择排序法对给定的数组进行排序操作。下面先通过图11-4来了解第一轮的比较操作。

11.3 选择法排序 - 图1

图 11-4 第一轮的比较操作

接下来在第一轮比较结果的基础上进行第二轮比较操作,如图11-5所示。

11.3 选择法排序 - 图2

图 11-5 第二轮的比较操作

分析上面的比较结果,第二轮比较结果与第一轮的比较结果完全一致,没有将第二个数与接下来的任何一个数进行交换操作。下面通过图11-6来了解在此基础上进行的第三轮的比较操作。

11.3 选择法排序 - 图3

图 11-6 第三轮的比较操作

在第三轮的比较操作中,由于第5个数比第三个数要小,因此进行了一次交换操作。接下来再来通过图11-7看看第四轮的比较操作。

11.3 选择法排序 - 图4

图 11-7 第四轮的比较操作

由上面的比较结果可知,这时已经成功地实现了对数组的排序。