输入十整数,按升序输出,并且奇数
你这段代码有太多漏洞了。你的思路大概应该是这样的:1、对输入的数组进行遍历,把奇数部分放在数组的前半部分,偶数的放在后半部分。2、分别对前后两部分进行排序,得到想要的结果。
然而,你的程序也相应的有两个个问题。
对于第一步,你的程序是:先统计奇偶数的个数,分别记录在h和m上。接着有
for(i=0;i<10;i++)
if(a[i]%2)
a[n--]=a[i];//把奇数放在一起
else
a[m++]=a[i];//把偶数放在一起
你想想,假如奇数个数为6,第一个数和第六个数都是奇数,不妨假设a[0]=1,a[5]=3,那么遍历到第一个数就会有a[5]= a[0]=1。 a[5]...全部
你这段代码有太多漏洞了。你的思路大概应该是这样的:1、对输入的数组进行遍历,把奇数部分放在数组的前半部分,偶数的放在后半部分。2、分别对前后两部分进行排序,得到想要的结果。
然而,你的程序也相应的有两个个问题。
对于第一步,你的程序是:先统计奇偶数的个数,分别记录在h和m上。接着有
for(i=0;i<10;i++)
if(a[i]%2)
a[n--]=a[i];//把奇数放在一起
else
a[m++]=a[i];//把偶数放在一起
你想想,假如奇数个数为6,第一个数和第六个数都是奇数,不妨假设a[0]=1,a[5]=3,那么遍历到第一个数就会有a[5]= a[0]=1。
a[5]还没遍历到之前它的值就被你替换掉了,这样会流失了后面的数值。如果这时a[5]是偶数,那么这个偶数也同样被你破坏了。 从偶数的角度分析也是一样道理。
其次,n--和m++并不互补,也就是不对立有重叠。
据你的程序始终有n=m,那么n--和m++使m(或者n)本身的值丢失。
上述问题的解决方法有两个。第一种方法就是建立一个新的和a数值长度的数组,假设为b[10],那么上述程序写成
for(i=0;i<10;i++)
if(a[i]%2)
b[n--]=a[i];
//n先返回再自减,也就是n--是从n开始计数的,而非n-1
else
b[++m]=a[i];//m先自加,也就是m是从m+1开始计数的
另一种方法就是类似快速排序的方法。
这道题其实和快速排序的第一步——把数组划分为两个部分相类似。
具体:使用两个变量,从数组的低下标往上计数和从数组高下标往下计数。假设两量为i,j。 初始化:i=0,j=9; 如果a[i]为偶数且a[j]为奇数,则两者调换。
如果如果a[i]为奇数且a[j]为偶数,则不操作,i++,j--;如果a[i]为偶数且a[j]为偶数,则j--。如果a[i]为奇数且a[j]为奇数,则i++。直到i=j的时候完成。当然,最后可以根据i(或者j)的大小判断奇数或偶数的个数了。
。收起