循环遍历数组的两种方法
设有数集{3,2,5,8,4,7,6,9},无序且不重复
问题1.任意输入k,输出在数集中的一对和为k的数。
问题2.将所有偶数放在奇数后面。
问题分析:将数集用数组存储,这时就有两种遍历数组的方式,方法一是顺(逆)序式,方法二是两边向中间逼近。这两种方法都能解决问题,但是对于第一题使用方法二的前提是得先对数集排序。
问题一两种代码(部分):
int a[N],i,j,flag=1; //设立标志代替break
for (i=0; i<N-1 && flag; ++i)
{for (j=i+1; j<N; ++j){if (a[i]+a[j]==k){printf("%d %d",a[i],a[j]);flag=0;}}
}
//a[N]已经进行排序
int a[N],i,j,flag=1;
for (i=0,j=N-1;i<j && flag;)/*i定位到第一个元素,j定位到最后一个*/
{if(a[i]+a[j]<k)i++;if (a[i]+a[j]>k)j--;if (a[i]+a[j]==k){printf("%d %d ",a[i],a[j]);flag=0;}
}
第一种方法对效率o(n²),排序之后对情况使用第二种方法效率为o(n/2);
问题二两种方法(部分)
int a[N],i=0,j;
int n=N,x;
while (i<n)
{if (a[i]%2)//如果是奇数的话不动i++;else{//如果是偶数的话移到最后面x=a[i];for (j=i; j<n-1; j++){a[j]=a[j+1];}a[j]=x;n--;//n的作用相当于岗哨,防止程序进入死循环,它的前面始终为初始时的数组的最后一个元素,后面永远为偶数。}
}
int a[N],i=0,j=N-1,x;
while (i<j)
{if (a[i]%2)i++;else if(!(a[j]%2))j--;//a[i]不是奇数时且a[j]不是偶数时,奇偶互换else{x=a[i];a[i]=a[j];a[j]=x;i++;j--;}
}
同样的,第二种效率要高很多。
所以,遇到类似的问题要优先想到第二种方法。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
