方法1——用一个新数组接收原数组中的偶数,通过一次遍历,把奇数留在原数组,按顺序从下标0开始放;把偶数依次放在新数组。
一次遍历完后,把偶数数组元素依次全部复刻到新数组后面接上即可。
int* reOrderArray(int* array, int arrayLen, int* returnSize ) {
int* even = malloc(sizeof(int) * arrayLen);
int i = 0, j = 0,k = 0;
for(i = 0,j = 0; i < arrayLen; i++){
if(array[i] % 2 == 1)
array[k++] = array[i]; //放奇数
else
even[j++] = array[i]; //放偶数
}
for(j = 0; k < arrayLen; k++)
array[k] = even[j++]; //把偶数接过去
*returnSize = arrayLen;
return array;
}
时间复杂度度O(n),空间复杂度O(n).
如果要求空间复杂度为O(1),也可以直接在原数组操作,只不过时间复杂度更高一些。
方法2——遇到偶数不管,遇到奇数时,把从前一个奇数到这个奇数中间的数后移一位,然后把当前奇数插到前面奇数序列尾部。然后继续
int* reOrderArray(int* array, int arrayLen, int* returnSize ){
int i = 0, j = 0, k = 0;
for(j = 0; j < arrayLen; j++){
if(array[j] % 2 == 0)
continue;
else{
int tmp = array[j];
for(k = j-1; k >= i; k--)
array[k+1] = array[k];
array[i++] = tmp;
}
}
*returnSize = arrayLen;
return array;
}

京公网安备 11010502036488号