C语言问题:编写一个函数,使10个整数按由大到小顺序排序
书上的例子:#include<stdio.h>intmain(){voidsort(intx[],intn);inti,*p,a[10];p=a;printf("plea...
书上的例子:
#include <stdio.h>
int main()
{
void sort (int x[],int n);
int i,*p,a[10];
p=a;
printf("please enter 10 integer numbers:");
for(i=0;i<10;i++)
scanf("%d",p++);
p=a;
sort(p,10);
for(p=a,i=0;i<10;i++)
{
printf("%d ",*p);
p++;
}
printf("\n");
return 0;
}
void sort (int x[],int n)
{
int i,j,k,t;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
if(x[j]>x[k])
k=j;
if(k!=i)
{
t=x[i];
x[i]=x[k];
x[k]=t;
}
}
}
问题:
void sort (int x[],int n)
{
int i,j,k,t;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
if(x[j]>x[k])
k=j;
if(k!=i)
{
t=x[i];
x[i]=x[k];
x[k]=t;
}
}
}
运行结果没问题,但它不是明显有问题吗?当i=0时,是把最小的一个数调到数组的最后一个元素,而当i=1时,第一个元素已不再做比较,可是第一个元素不一定是最大的,这样怎能按由大到小的顺序排列呢?我把它改成:
void sort (int x[],int n)
{
int i,j,k,t;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
if(x[j]>x[k])
{
t=x[j];
x[j]=x[k];
x[k]=t;
}
}
}
我脑子都快爆开了,希望高手能够说明书中给出的例子为什么对 展开
#include <stdio.h>
int main()
{
void sort (int x[],int n);
int i,*p,a[10];
p=a;
printf("please enter 10 integer numbers:");
for(i=0;i<10;i++)
scanf("%d",p++);
p=a;
sort(p,10);
for(p=a,i=0;i<10;i++)
{
printf("%d ",*p);
p++;
}
printf("\n");
return 0;
}
void sort (int x[],int n)
{
int i,j,k,t;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
if(x[j]>x[k])
k=j;
if(k!=i)
{
t=x[i];
x[i]=x[k];
x[k]=t;
}
}
}
问题:
void sort (int x[],int n)
{
int i,j,k,t;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
if(x[j]>x[k])
k=j;
if(k!=i)
{
t=x[i];
x[i]=x[k];
x[k]=t;
}
}
}
运行结果没问题,但它不是明显有问题吗?当i=0时,是把最小的一个数调到数组的最后一个元素,而当i=1时,第一个元素已不再做比较,可是第一个元素不一定是最大的,这样怎能按由大到小的顺序排列呢?我把它改成:
void sort (int x[],int n)
{
int i,j,k,t;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
if(x[j]>x[k])
{
t=x[j];
x[j]=x[k];
x[k]=t;
}
}
}
我脑子都快爆开了,希望高手能够说明书中给出的例子为什么对 展开
5个回答
展开全部
注意循环体,第二个for循环的循环体是if(x[j]>x[k]) k=j;意思是将数组中最大数的下标赋值给k,因此第二个for 循环结束退出后x[k]就是这些数中的最大数,然后执行下面的语句,把最大数放到这些数的最前面位置,然后再执行第一个for循环找这些数中第二大数放到第二位置,如此进行下去就ok了。这是种选择法排序。
你改的是种冒泡排序,但要把k=i;这语句去掉,希望对你有帮助
你改的是种冒泡排序,但要把k=i;这语句去掉,希望对你有帮助
追问
if(k!=i)
{
t=x[i];
x[i]=x[k];
x[k]=t;
}
不是又把X[k]变小了吗
追答
刚开始执行时i=0,k=0,经过
for(j=i+1;jx[k])
k=j;
选择出了这所有数中的最大数假设是x[4],即此时j=4,k=4,再经过
if(k!=i)
{
t=x[i];
x[i]=x[k];
x[k]=t;
}
使x[0]的值和x[4]的值互换,最大数就放到了最前面位置,再返回到第一重循环,i=1,k=1,再执行下面的语句,如此下去...
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这个是用的冒泡法来排序的,
void sort (int x[],int n)
{
int i,j,k,t;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
if(x[j]>x[k])
k=j;//将大的那个坐标记下
if(k!=i)//如果坐标有变则将大的数放在最前面的位置
{
t=x[i];
x[i]=x[k];
x[k]=t;
}
}
}
所以该例子是把大的数放到第一个。
void sort (int x[],int n)
{
int i,j,k,t;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
if(x[j]>x[k])
k=j;//将大的那个坐标记下
if(k!=i)//如果坐标有变则将大的数放在最前面的位置
{
t=x[i];
x[i]=x[k];
x[k]=t;
}
}
}
所以该例子是把大的数放到第一个。
追问
if(k!=i)
{
t=x[i];
x[i]=x[k];
x[k]=t;
}
不是又把X[k]变小了吗,也就是x[i]>x[k],第二次比较的时候就x[k]与第三个元素比较,这样令最大值排第一位呢
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
该法为选择法排序,当i=0时,把x[0]与x[1],x[2]........x[9]比较。如果这个数比x[0]大,就把这个数与x[0]交换。然后再看下面的数,比交换后的x[0]大的话还交换。直到x[0]与后面的9个数比完为止。x[0]中放的就是10个数中最大的。然后把x[1]与后面的8个数相比。以此循环下去,就成了按大小排序的10个数。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
建议直接调用库函数排序,qsort或者sort
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询