C排序出现的问题

程序代码:实现数组的排序。

int main(int argc, char * argv[]) {
int a[]={100,55,99,858,1,6,9,88,57,0};
int m,n;
for(m=0;m<9;m++){
for(n=1;n<=9;n++){
int p;
if(a[m]>a[n]){
p=a[m];
a[m]=a[n];
a[n]=p;
}
}
}
printf("%d\n",a[0]);
printf("%d\n",a[1]);
printf("%d\n",a[2]);
printf("%d\n",a[3]);
printf("%d\n",a[4]);
printf("%d\n",a[5]);
printf("%d\n",a[6]);
printf("%d\n",a[7]);
printf("%d\n",a[8]);
printf("%d\n",a[9]);
}
(https://img-blog.csdnimg.cn/20190118120135743.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM2OTQyMjkx,size_16,color_FFFFFF,t_70)
刚开始的实验目的仅仅是实现数组中最大值放到最后这一功能,但是实验结果出错。
分析问题:根据a[0]的输出为0,会发现第一次比较找到了数组中的最小值,所以是a[m]与a[1]-a[9]依次进行了比较。自己的误区是以为a[0]与a[1]比较完,然后直接进行a[1]与a[2]的比较。倒是这样也明白将数组全排序方法(如下由大到小)
for(m=0;m<=9;m++)
for(n=0;n<=9;n++){
int p;
if(a[m]>a[n]){
p=a[m];
a[m]=a[n];
a[n]=p;
}
}
现在考虑如何对数组进行直接寻找最大值(或最小值)的方法。
思路一:可以直接定义两个指针,一个指向数组的起始端,一个指向数组的末端,加“*”取数据进行比较,让数据小的指针后移(或者前移),数据大的指针不变。当两个指针指向的同一地址单元时,该单元中的数据就是该数组中的最大值。代码如下:
int *q,*w;
q=a;
w=&a[9];
while(q!=w) {
if(*q<*w){
q++;
}
else
{
w–;
}
}
printf(“最大值是: %d”,*q);
(https://img-blog.csdnimg.cn/20190118153827629.png)
切记:每一个控制语句的条件,别因小失大!
思路二:我们可以假设数组的第一个元素是最大值(或者最小值),将他赋给某一变量,然后让指针一次遍历完整个数组,当某一数据大于初始设定,就让它替换变量中的数据,这样变量中最后存下的数据就是最大值(或最小值)。
int m=a[0];
int *q;
int i;
for (i=1;i<=sizeof(a)/sizeof(int);i++){
q=&a[i];
if(*q>m){
m=*q;
}
}
printf(“最大值是: %d”,m);
(https://img-blog.csdnimg.cn/20190118154949393.png)
总结:逻辑思维和编程相结合才能更快的提高c能力,光靠阅读和想象是不行的。其次就是指针,这是学c必须必须掌握的!

猜你喜欢

转载自blog.csdn.net/qq_36942291/article/details/86538085