数组排序并记录原位置c语言,5个数值排序并记下排列后的数值跟原本该数所处位置(第一个位置设为0),存在2个数组中...

本文介绍了一个数值排序问题,即对5个输入的整数进行排序,并记录每个数排序前的位置。通过分析给出的代码,指出了存在的问题,并提供了解决思路。主要涉及数组操作、排序算法等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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_;  \

}  \

}  \

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值