#define N 10//宏定义,用N代替10
#include "stdio.h"//标准输入输出库,你在控制台输入数据和显示数据用的
main()//主函数
{
int a[N],i,j,temp;//声明需要排序的数组a和排序用的的一些“小工具”,i、j、temp
printf("请输入%d个整数:\n",N);
for(i=0;i<N;i++)//这个循环是和用户交互,手动输入10个数理组成数组
scanf("%d",&a[i]);
for(i=0;i<N-1-i;i++)//i从前往后数
for(j=0;j<N-1-i;j++)//在每一个i(比如0,比如1)下从前往后数j
if(a[j]>a[j+1])//如果j比他后边的大,交换
{temp=a[j];a[j]=a[j+1];a[j+1]=temp;}//两数前后互换
//上边这个循环就是从前往后数a的元素,比如到a[0],那么最大的数移到最后一位;在比如a[1],倒数第二大的数移到倒数第二位(因为最大的在后边,你移步过去了?)
//为什么要走这么多次。每次j的循环都好比一个波浪,一次只能保证一个最大数到了最后一位,其他的可能还是乱序,所以要一浪接一浪。
//这个算法的巧妙之处在于,i只走一半,也就是i从0到4,而j每次也不用到最后一位(j<N-1-i),因为最后那i+1位已经排好了
//比较次数,i=0时9次,i=1时8次,i=2时7次,i=3时6次,i=4时5次,一共35次
printf("排序之后的数据序列:\n");
for(i=0;i<N;i++)//把排序后的数列显示出来,%5d代表每一个数占5位,就是排列的整齐点。
printf("%5d",a[i]);
printf("\n");
}
#include"stdio.h"
#define N 10
main()
{
int a[N],i,j,r,temp;
printf("请输入%d个整数:\n",N);
for(i=0;i<N;i++)
scanf ("%d",&a[i]);
for(i=0;i<N-1;i++)//用i遍历数组a。
{r=i;//局部的r值,i从0到8每次不同,r也不同。
for(j=i+1;j<N;j++)//j是从i当前的值一直到最后(前一种排序时每次j的结尾位置不同,到9,到8.到7。)
if(a[j]<a[r])r=j;//用r标记最小的一个值,
if(r!=i)//如果这个最小的值不是a[i],对换,让i所在值变成最小,意思是a[0]最小,a[1]第二小,以此类推
{temp=a[r];a[r]=a[i];a[i]=temp;}
}
printf("排序之后的数据序列:\n");
for(i=0;i<N;i++)
printf("%5d",a[i]);
printf("\n");
//i=0,j循环9次;i=1,j循环8次。。。。一共45次
}
我把函数改了,这样可以测试,你去跑一下就明白过程了
#include"stdio.h"
#define N 10
main()
{
int count = 0;
int a[N],i,j,r,temp;
printf("请输入%d个整数:\n",N);
for(i=0;i<N;i++)
scanf ("%d",&a[i]);
for(i=0;i<N-1;i++)
{r=i;
for(j=i+1;j<N;j++){
if(a[j]<a[r])r=j;
count++;
printf("i:%d\tj:%d\tcount:%d\n",i,j,count);
}
if(r!=i)
{temp=a[r];a[r]=a[i];a[i]=temp;}
}
printf("排序之后的数据序列:\n");
for(i=0;i<N;i++)
printf("%5d",a[i]);
printf("\n%d\n",count);
}
温馨提示:答案为网友推荐,仅供参考