C语言比较大小排序问题

#define N 10
#include "stdio.h"
main()
{
int a[N],i,j,temp;
printf("请输入%d个整数:\n",N);
for(i=0;i<N;i++)
scanf("%d",&a[i]);
for(i=0;i<N-1-i;i++)
for(j=0;j<N-1-i;j++)
if(a[j]>a[j+1])
{temp=a[j];a[j]=a[j+1];a[j+1]=temp;}
printf("排序之后的数据序列:\n");
for(i=0;i<N;i++)
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++)
{r=i;
for(j=i+1;j<N;j++)
if(a[j]<a[r])r=j;
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");
}

知道这俩源代码是比较大小排序的 但还是请高人逐字逐句的讲解一下 并写出这俩算法的排序过程 还有比较次数 谢啦!

#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);
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2021-04-20

C语言大小字母输出

第2个回答  推荐于2017-11-26
其实楼主可以自己放数去试 
#include"stdio.h"
#define N 10
int 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++)                             //从a[0]开始循环到a[9]
{
r=i;                                       //i = 0赋值给r,r = 0
        for(j=i+1;j<N;j++)                         /*最巧妙的在这里,内嵌for循环只控制了一个if语句,if语句控制r = j;结合下面的if语句就是第一个轮流跟后面每一个比较
   然后换掉下标,直到比它小的为止,如果比a[0]大的话就不换,继续执行外循环*/

        if(a[j]<a[r])
 r=j;
        if(r!=i)                                   //如果内循环中的r = j执行了,那么会把比a[0]大的元素位置呼唤,循环9次,就能把所有的数换过来
{
temp=a[r];a[r]=a[i];a[i]=temp;
}
}
    printf("排序之后的数据序列:\n");
    for(i=0;i<N;i++)
         printf("%5d",a[i]);
    printf("\n");
return 0;
}


//这个排序方法类似于冒泡排序,也是一个个出来的

本回答被提问者采纳
第3个回答  2013-11-11
for(i=0;i<N-1-i;i++)
for(j=0;j<N-1-i;j++)
if(a[j]>a[j+1]),看这里就行了,这里懂吗??自己写个数组,一个个对比看看
第4个回答  2013-11-11
一般不是追求特快的排序方法的话、、
掌握选择排序或者冒泡排序应该已经足够了吧。。

你第一个程序应该是冒泡排序,没错吧?

下面一个应该不是冒泡或者选择。。。不懂、、、本回答被网友采纳
相似回答