/*
用选择法对从键盘上输入的10个数据按从小到大的顺序排序
分析:
选择法的思想是;先把第一个元素作为最小者,与后面元素比较
如第一个元素大,则与其交换(保证第一个元素总是很小),直
到与最后一个元素比较完,第一趟就找出了最小元素,且保存在
第一个元素位置。再以第二个元素作为最小者(次小)与后面元
素比较,若后面元素小,则交换,直到最后一个元素,第二小的
元素已找到。以此类推,经九趟后排定
#include <stdio.h>
int main()
{
int i,j,temp;
int a[10];
printf("请输入十个数:\n");
for(i=0;i<10;i++) //循环输入10个数给数组赋值
scanf("%d",&a[i]);
//和冒泡排序法比较的次数相同n-1
for(i=0;i<9;i++) //共比较9次 n-1
for(j=i+1;j<10;j++) //每一次比较10-i-1次
if(a[i]>a[j]) //每一个数都和后面的数依次比较,如果大于后面的数,则进行交换
{
temp=a[j];
a[j]=a[i];
a[i]=temp;
}
printf("输出排序后的数 \n");//循环输出排序后的数
for(i=0;i<10;i++)
printf("%d\t",a[i]);
return 0;
}
此例中,使用两重循环来实现排序。外层循环控制排序趟数,若数组中有n个元素,则共进行n-1趟。
内层循环完成在剩余的数中选择最小的数,比较次数随趟数递减,循环控制变量j的初值与 外循环
执行次数有关:j=i+1,终值为n.当后面元素较大时,马上交换。值得注意的是:以上程序执行时元
素的交换并不都是必须的。实际上,只要记住比较时小元素的位置,即序号,在内循环结束时做一
次循环即可,从而提高程序执行的效率。
*/
/*
经过改进后的程序每一趟只需要交换一次元素(注意:元素一般是一个比较复杂的数据结构,交换所需要的时间比整数的
赋值要多),提高了程序执行的效率。
*/
#include "stdio.h"
int main()
{
int a[10],i,j,k,temp; //i,j 是循环变量 k始终存储本趟最小元素的下标 temp:交换时的暂存值 a[10]:存储输入的是个数据
printf("请输入十个数: \n");
for(i=0;i<10;i++) //循环输入十个数据
scanf("%d",&a[i]);
printf("输出输入的十个数: \n");
for(i=0;i<10;i++) //循环输出十个数据
printf("%d ",a[i]);
printf("\n");
/*
for(i=0;i<9;i++) //十个数据,每个数都和剩下几个数相比较,共比较九次
{
k=i; //k始终存放本趟最小元素的下标,开始时为i
for(j=i+1;j<10;j++) //每个元素都比较10-i-1次
if(a[i]>a[j]) ///注意这个if语句的括号 在这个程序中是必须包含的
{
k=j; //记住新的最小元素的序号
if(k!=i) //判断第一个元素是否是最小的元素,若k!=i,则说明和其他元素比较的这个元素不是最小的,进行交换
{
temp=a[j];
a[j]=a[i];
a[i]=temp;
} //这部分注释的地方和第一种方法是一样的,k没有什么作用
}
}
*/
for(i=0;i<9;i++) //十个数据,每个数都和剩下几个数相比较,共比较九次
{
k=i; //k始终存放本趟最小元素的下标,开始时为i
for(j=i+1;j<10;j++) //每个元素都比较10-i-1次
if(a[k]>a[j]) ///注意这个if语句的括号 在这个程序中是必须包含的
k=j; //记住新的最小元素的序号
if(k!=i) //判断第一个元素是否是最小的元素,若k!=i,则说明和其他元素比较的这个元素不是最小的,进行交换
{
temp=a[k];
a[k]=a[i];
a[i]=temp;
}
}
printf("排序后的十个数是:\n");
for(i=0;i<10;i++) //循环输出排序后的数 循环变量用i和j都行
printf("%d ",a[i]);
printf("\n");
return 0;
}
/*
总结下:
for(i=0;i<9;i++) //十个数据,每个数都和剩下几个数相比较,共比较九次
{
k=i; //k始终存放本趟最小元素的下标,开始时为i
for(j=i+1;j<10;j++) //每个元素都比较10-i-1次
if(a[i]>a[j]) ///注意这个if语句的括号 在这个程序中是必须包含的
k 开始理解错误的点在于循环判断一直用的是a[i],但设的是k始终保存的是最小数的下标,
应该用k下标的数去和其他数进行比较
k=j; //记住新的最小元素的序号
if(k!=i) //判断第一个元素是否是最小的元素,若k!=i,则说明和其他元素比较的这个元素不是最小的,进行交换
{
temp=a[k];
a[k]=a[i];
a[i]=temp;
}
}
书上所描述的第二种方法的核心算法如上:开始理解有些错误 在第一个if语句的判断
*/