方法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; }