请帮解释一下这道C语言题的思路。

来源:百度知道 编辑:UC知道 时间:2024/06/16 18:59:51
用选择法对10个整数排序
程序如下:
main()
{int *p,i,a[10];
p=a;
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++;}
getch();
}
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;} /*到这里结束*/
}
}
1 选择法的解题思路是什么?
2 下面被调函数中做标记的几行是什么意思?
3 对嵌套循环一直比较迷惑,是先把里面包含的循环执行完,再从外面开始,还是从外到里一次,然后再从外到里?

以上3个问题,还望各位老师能帮一一解答,谢谢。

1.选择排序的算法思路就是从n个数据中选出最大的值,将它和第一个位置的值交换,然后再从剩下的n-1个数据中选出最大的值,将它和第二个位置的值交换,就这样一直进行到最后一个数据为止。

2.
for(i=0;i<n-1;i++)
{k=i;/*保存现在的数组元素下标*/
for(j=i+1;j<n;j++) /*从i+1位置开始,一直到第n个位置,逐一和第k个数据相比,如果发再第j个数据比第k个数据大,就将当前的j保存到k中,这样,当这个循环结束时,k就存储着最大数据的下标*/
if(x[j]>x[k])k=j;
if(k!=i)/*如果到这里发现k已经不是原来的i值,说明在上面的循环中找到了省下的元素中的最大值,因此要通过下面的语句交换第k位和第i位元素*/
{t=x[i];x[i]=x[k];x[k]=t;}

3.
是先把里面的循环执行完,再从外面开始下一次循环是否执行的判断。

选择法思路是 首先选定一个数值为初值,比如K 这个值和后面的值比较,如果后面的值I大于或小于它,则将值i赋予k,直到循环结束。

标记是C语言中用来注释的,便于程序的理解,如果程序很长很大的话,注释是很有用的。

嵌套循环可以这样理解:
比如
for(i=0;i<10;i++)
for(j=0;j<5;j++)
{

}
首先 i=0; j从 0循环到4;
然后 i++ ;i=1; j在从0循环到4;
直到 i=9; j在从0循环到4,
嵌套循环结束 循环体里的语句要执行50次。

关于选择法,是从一组待排序的数是找出最小的一个数和第一个数交换,再从第2个数开始找出最小的和第2个数交换,以此类推,直到排序完成.
选择法的时间复杂度为O(n2)
嵌套循环是先把内循环做完了再做外循环,比如:
for(i=0; i<10; i++)
{
for(j=0; j<10; j+