C语言冒泡排序法,疑问啊~~~~~~~~~~~~~~~~~

来源:百度知道 编辑:UC知道 时间:2024/06/17 18:59:50
#include<stdio.h>
#define N 15
main()
{ int *p[N],a[N],i,j,*temp;
for(i=0;i<=N-1;i++)
{ scanf("%d",&a[i]);
p[i]=&a[i];
}
for(i=1;i<=N-1;i++)
{
for(j=0;j<=N-1-i;j++)
if(a[j]>a[j+1])
{ temp=p[j];
p[j]=p[j+1];
p[j+1]=temp;

}

}
printf("\n");
for(i=0;i<=N-1;i++)
{ printf("%d ",*p[i]);
printf("a[%d]=%d\n",i+1,a[i]);
}
}
这一段代码为什么不能实现排序?是指针有问题吗,还是其他方面的?

{ int *p,a[N],i,j,temp;
for(i=0;i<=N-1;i++)
{
scanf("%d",&a[i]);
}
p = a;
for(i=1;i<=N-1;i++)
{
for(j=0;j<=N-1-i;j++)
if(a[j]>a[j+1])
{ temp=p[j];
p[j]=p[j+1];
p[j+1]=temp;
}
}
前面的改成这样
int *p[N]这样的指针数组一般用来指向2维数组
你用 int *p指向一维数组就足够了

当然,你要是用这个程序来训练指针的话
那就是下面的错误
你的意义不明确
是要实现a,p的排序呢,还是只实现p的排序a不变

a,p的排序
if(a[j]>a[j+1])
{ temp=p[j];
p[j]=p[j+1];
p[j+1]=temp;
这里你交换了指针的值,但是指针所指向的值没改动啊,这样if条件就不是冒泡算法,你改变了p[j]的地址但没有改变a[j]值,
a[j]不变的话你冒泡就不成立了啊
应该该成
temp = new int;//在第一个for外面加

if(a[j]>a[j+1])
{ *temp = *p[j];
*p[j] = *p[j+1];
*p[j+1] = *temp;
来改动指针的指向,使得a[]数组随之变化来实现冒泡

或者你是这样想
a数组里面的值不变,实现排序*p
那if条件改成
if(*p[j]>*p[j+1])
这样才能通过指针地址的改变实现对*p数组的排序
a数组的内容不变

#incl