Q:输入一个整数数组,实现一个函数,来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,所有偶数位于数组的后半部分。
A:方法一:从数组的前后两端开始对每个数进行判断,直到判断完最中间元素后完成数组的调整,下面给出代码:
//方法一
void Reorder(int *array,int sz)
{
int i=0;
int j=sz-1;
while(i<j)
{
if(array[i]%2==1) //奇数
{
if(array[j]%2==1)//奇数
{
i++;
}else//偶数
{
j--;
}
}else//偶数
{
if(array[j]%2==1)//奇数
{
//交换array[i]和array[j]
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}else//偶数
{
j--;
}
}
}
}
下面是我优化后的结果,我们对数组第一个元素进行了判断,如果是奇数,则直接从第二个数开始判断,如果不是,则直接与最后一个数进行交换,交换完后数组下标分别递减,放在后面的偶数不用在进行交换
//方法二
void Adjust(int *arr,int sz)
{
int i = 0;
int j = sz -1;
int tmp = 0;
for (i=0;i!=j;i++)
{
if (arr[i]%2 != 0)
continue;
else
{
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
i--;
j--;
}
}
}
以下就是输入和输出数组 int main()
{
int arr[N] = {0};
int i = 0;
int sz = 0;
printf("调整前>>>\n");
for (i=0;i<N;i++)
{
scanf("%d",&arr[i]);
}
printf("\n");
sz = sizeof(arr)/sizeof(arr[0]);
Adjust(arr,sz);
//调整后
printf("调整后>>>\n");
for (i=0;i<N;i++)
{
printf("%d ",arr[i]);
}
Reorder(arr,sz);
//调整后
printf("调整后>>>\n");
for (i=0;i<N;i++)
{
printf("%d ",arr[i]);
}
return 0;
}