本实例实现的功能是:用选择排序法对从键盘输入的10个数由小到大进行排序。
程序中用到了两个for循环语句,第一个for循环是确定位置的,即第几个位置,放置哪个数,就是确定a[i]的值,比如当i=0时,就是确定a[0].
第二个for循环的作用是实现a[i]与后面待排序区间中的数进行比较。
#include <stdio.h>
#include <stdlib.h>
void main()
{
int i,j,t,a[11]; //定义变量及数组为基本整型
printf("请输入10个数:\n");
for(i=1;i<11;i++)
{
scanf("%d",&a[i]); //从键盘中输入要排序的10个数字
}
for(i=1;i<=9;i++)
{
for(j=i+1;j<=10;j++)
{
if(a[i]>a[j]) //如果第i个数比第j个数大,则利用中间变量t实现两值互换
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
}
printf("排序后的顺序是:\n");
for(i=1;i<=10;i++)
{
printf("%5d",a[i]); //输出排序后的数组
}
printf("\n");
system("pause");
}
排序选择的基本算法是,从待排序的区间中经过选择和交换后选出最小的数值存放到a[0]中,再从剩余的未排序区间中经过选择和交换后选出最小的数值存放到a[1]中,a[1]中的数字仅大于a[0],依次类推,即可实现排序。
选择排序与冒泡排序的异同:
相同点是,两个算法都有两次for循环,都是通过比较,利用中间量交换数值。
不同点是,在选择排序中,第一层for循环是确定在哪个位置插入哪个数,i=0时确定a[0],并且a[0]是所有数中最小的,当i=1时,确定a[1],a[1]仅仅大于a[0],而小于其他的数
在冒泡排序中,第一层for循环是比较的趟数,如有n个数,第一趟,则进行n-1次两两比较;第j趟,进行n-j次两两比较
在第二层for循环中,两两比较的方式也有所不同,选择排序是固定a[i],a[i]的位置不变,来和待排序的a[j]做对比。而冒泡排序中,则是a[j]与a[j+1]做比较,它们是两两相邻的,而选择排序中两两比较的数并不都相邻。