5个数值排序并记下排列后的数值和原本该数所处位置(第一个位置设为0),存在2个数组中
/*我写的以下代码,麻烦大家帮我看一下,为什么执行出来老是出现最后一个数所对应的原本位置出错,且总显示为1,拜托麻烦大家了,小妹在此衷心感谢!!!*/
int main(){
int a,b,c,d,e;
printf("please input five numbers:");
scanf("%d%d%d%d%d",&a,&b,&c,&d,&e);
list(a,b,c,d,e);
system("pause");
return 0;
}
int list(int a,int b,int c,int d,int e){
int z[3]={a,b,c},m[2]={d,e},h,f[5],g,i,j,k,l[5],r;
for(i=0;i<=2;i++)
{for(j=0;j<=1;j++)
{if(z[i]>m[j])
{k=k+i;f[k]=j+3; /*因为f[i]中装的是m[j]原本的排列序号j+3,而且经过排序后z[i]位置上是m[j]*/
k=0; k=j+3;f[k]=i; h=z[i];z[i]=m[j];m[j]=h;k=0;}
else
{k=k+i;f[k]=i;k=0;k=j+3;f[k]=j+3;k=0;}//原来的排列顺序都存在f[5]中了
}}//截至此处,就保证了,z[3]中现在储存的数都比m[2]中的小
//现在用相同的方法对z[3]中的数进行排序
for(i=0;i<=1;i++)
{
if(z[i]>z[2])
{k=k+i;f[k]=2;k=0;k=k+2;f[k]=i; h=z[i];z[i]=z[2];z[2]=h;k=0;}
else
{k=k+i;f[k]=i;k=0;k=k+2;f[k]=2;k=0;}
}
if(z[0]>z[1])
{h=f[0];f[0]=f[1];f[1]=h;h=z[0];z[0]=z[1];z[1]=h;}
//下面在比较一下m[2]中的两个数
if(m[0]>m[1])
{h=f[3];f[3]=f[4];f[4]=h;h=m[0];m[0]=m[1];m[1]=h;}
l[0]=z[0];l[1]=z[1];l[2]=z[2];l[3]=m[0];l[4]=m[1];//经过排列后的数存在l[5]中
printf("order of numbers are:");
for(r=0;r<=4;r++)
printf(" %d",l[r]);
printf("\n");
printf("list of numbers are:");
for(k=0;k<=4;k++)
printf(" %d",f[k]);
printf("\n");
return 0;
}
------解决思路----------------------
代码风格很丑陋!实在看不下去,不知道有几个人会看你的代码。而且里面存在错误明显:
k=k+i;f[k]=j+3;这里k没初始化,f[k]就访问了,数据越界访问不崩溃?其它有没错误尚不知道,是在是看不下去了。
------解决思路----------------------
#include
#define NUMERIC_COMPARATOR(x, y) (((x)>(y)?1:((x)
#define ARRAY_INSERT_SORT_MOD(type, a, max, comparator, s) { \
int _i_, _j_; \
int _left_, _right_, _mid_; \
type _key_; \
for(_i_=1; _i_
{ \
_key_ = a[_i_]; \
/* 用二分法查找到需要插入的位置 */ \
_left_ = 0; \
_right_ = _i_ - 1; \
while(_left_ <= _right_) \
{ \
_mid_ = (_left_ + _right_) >> 1; \
if(comparator(a[_mid_], _key_) > 0) \
{ \
_right_ = _mid_ - 1; \
} \
else if(comparator(a[_mid_], _key_)
{ \
_left_ = _mid_ + 1; \
} \
else \
{ \
_left_ = _mid_; \
break; \
} \
} \
for(_j_=_i_ - 1; _j_>=_left_; _j_--) \
{ \
a[_j_ + 1] = a[_j_]; \
s[_j_ + 1] = s[_j_]; \
} \
if(_left_ != _i_) \
{ \
a[_left_] = _key_; \
s[_left_] = _i_; \
} \
} \
}