用指针方法对10个整数按由大到小顺序排序的源程序,我不明白定义的sort函数中for循环里面的内容。

#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;
}

}
}

外循环内嵌套的for循环里面的k=j是什么意思;然后就是内循环到哪里结束了,是到k=j;就结束了还是?
希望用//写注释说明一下,非常感谢。。。

#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; // k用来指向最大的一个数
for(i=0;i<n-1;i++)
{
k=i; //初始化k,指向第一个数,开始时,只有一个数,所以最大,
//下边的程序是把第i个数与第j个数作比较,把数向前挪动
for(j=i+1;j<n;j++)
if(x[j]>x[k]) //如果第j个数大于前边所有数中的最大数
k=j; //则k指向第j个最大的数
if(k!=i) //如果上边的if成立,即前边所有数中的最大数没有第j个大,则执行下边的程序
{
//以下程序完成将最大数放在最前边(i所指的位置),
//第一次i的循还则将最大数放在第一个位置
//第二次i的循还则将除第一次以外的最大数放在第二个位置
//。。。
t=x[i];
x[i]=x[k];
x[k]=t;
}

}
}
希望对你有帮助。。追问

谢谢 你的回答非常详细 和那个精辟哥一样厉害 再帮我一下 和他同样的问题 你看一下

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-12-15
#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; // 假定索引为i的元素最大
for(j = i + 1;j < n;j++) // 从索引为i的下一个元素开始比较
if(x[j] > x[k]) k = j; // 如果还有更大的,则记录这个元素的索引
if(k != i) { // 确实有更大的元素,则进行交换
t = x[i];
x[i] = x[k];
x[k] = t;
}

}
}追问

你好,你的那个“确实”太精辟了!还有几个问题,麻烦了,问题1、我觉得第内嵌的for循环只包括
for(j = i + 1;j x[k]) k = j;
外循环的第一次(i=0)结束后,再进行
if(k!=i)
{
t=x[i];
x[i]=x[k];
x[k]=t;
}

是这样吗?
问题2:你是怎么判断一个循环的结束的,就好比这道题内嵌的这个循环。
多谢。

追答

1、是的。
2、外循环遍历n - 1个元素,内循环每次都比前一次循环少一次。

追问

索引改变会改变数组元素中的值吗???!!!

本回答被提问者采纳
第2个回答  2012-03-22
这个sort,冒泡排序清晰明了,是你的sort难看懂而已
void sort(int a[],int n)
{
int t;
for(int j=0;j<n;j++)
for(int i=0;i<n-j;i++)
if(a[i]<a[i+1])
{
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
}
第3个回答  2012-03-22
冒泡排序的过程是两两比较大小第一趟选出最小的放在首位第二次选出次小放在第二位直到排序结束。你说的K=J不是结束而是找到了要进行前后替换得数的下标,K=J就是把要替换得下标现赋给K然后进行下面的替换:T=a[i]