输入一个长度为 n 整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前面部分,所有的偶数位于数组的后面部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
数据范围:
,数组中每个数的值
要求:时间复杂度
,空间复杂度
进阶:时间复杂度
,空间复杂度
[1,2,3,4]
[1,3,2,4]
[2,4,6,5,7]
[5,7,2,4,6]
[1,3,5,6,7]
[1,3,5,7,6]
第一次写的好复杂,取出奇数和偶数数组,在把他们合并。下次刷写个排序的0.0
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param array int整型一维数组
* @param arrayLen int array数组长度
* @return int整型一维数组
* @return int* returnSize 返回数组行数
*/
int* reOrderArray(int* array, int arrayLen, int* returnSize ) {
// write code here
int* arrOdd = NULL;
int* arrEven = NULL;
arrOdd = (int*)malloc(sizeof(int) * arrayLen);
arrEven = (int*)malloc(sizeof(int) * arrayLen);
if (arrOdd == NULL) {
// 处理内存分配失败的情况
return NULL;
}
if (arrEven == NULL) {
// 处理内存分配失败的情况
return NULL;
}
*returnSize = arrayLen; //指的是返回数组的大小
int m = 0;
int n = 0;
for (int i = 0; i < arrayLen; i++) {
if (array[i] % 2 != 0) {
arrOdd[m] = array[i];
m++;
} else {
arrEven[n] = array[i];
n++;
}
}
for (int i = 0; i < m; i++) {
array[i] = arrOdd[i];
}
for (int i = 0; i < n; i++) {
array[i + m] = arrEven[i];
}
return array;
} void bubble_swap(int* array, int len)
{
for(int i=len-2;i>=0;i--)
{
for(int j=i;j<len-1;j++)
{
if(array[j]%2==0 && array[j+1]%2!=0)
{
int tmp = array[j];
array[j] = array[j+1];
array[j+1] = tmp;
}
}
}
}
int* reOrderArray(int* array, int arrayLen, int* returnSize ) {
// write code here
*returnSize = 0;
if(array == NULL || arrayLen == 0)
return NULL;
bubble_swap(array,arrayLen);
*returnSize = arrayLen;
return array;
} 进阶一步到位
int* reOrderArray(int* array, int arrayLen, int* returnSize ) {
// write code here
int temp;
for(int i=0;i<arrayLen;i++){
if(i<0) i=0;
if(array[i]%2==0){
if(i==arrayLen) break; //若已排查到最后一个仍为偶数,则表明替换完成
if(array[i+1]%2==1){ //若当前为偶数,但是下一个为奇数,则二者交换
temp=array[i];
array[i]=array[i+1];
array[i+1]=temp;
i=i-2; //把指针放到刚才替换的这个偶数的前一个,解决连着都是偶数的情况
}
}
}
*returnSize=arrayLen;
return array;
} typedef struct SL//定义一个结构体模板
{
int* vate;//int指针/数组
int size;//实际数位计数
int capecity;//空间大小
}SL;
void init(SL* tr)//初始化
{
tr->vate = NULL;
tr->capecity = tr->size = 0;
}
void rea_cp(SL* tr)//扩容
{
int new_capecity = tr->capecity == 0 ? 4 : tr->capecity * 2;
int* tep = (int*)realloc(tr->vate, sizeof(int)*new_capecity);
tr->vate = tep;
tr->capecity = new_capecity;
}
int* reOrderArray(int* array, int arrayLen, int* returnSize )
{
// write code here
SL tr_1, tr_2;//声明两个结构体对象
init(&tr_1);//初始化两个结构体
init(&tr_2);
for(int i = 0; i<arrayLen; i++)//区分
{
if(array[i] % 2 == 0)//偶数放在tr_2中
{
if(tr_2.size == tr_2.capecity)//检查空间
{
rea_cp(&tr_2);
}
tr_2.vate[tr_2.size++] = array[i];
}
else//奇数放在tr_1中
{
if(tr_1.size == tr_1.capecity)//检查空间
{
rea_cp(&tr_1);
}
tr_1.vate[tr_1.size++] = array[i];
}
}
if(tr_2.size == arrayLen)//若偶数组等于原数组数位,则代表全是偶数,返回
{
*returnSize = tr_2.size;
return tr_2.vate;
}
if(tr_1.size == arrayLen)//若基数组等于原数组数位,则代表全是奇数,返回
{
*returnSize = tr_1.size;
return tr_1.vate;
}
for(int j = 0; j < tr_2.size; j++)//如果不是以上,则将偶数组元素插入倒奇数组后
{
if(tr_1.size == tr_1.capecity)//检查扩容
{
rea_cp(&tr_1);
}
tr_1.vate[tr_1.size++] = tr_2.vate[j];//倒数
}
*returnSize = tr_1.size;//返回
return tr_1.vate;
} int* reOrderArray(int* array, int arrayLen, int* returnSize ) {
//*returnSize=数组元素个数
int* arr=(int*)calloc(arrayLen, sizeof(int));
//int* arr=(int*)malloc(sizeof(int)*arrayLen);
//memset(arr,0,sizeof(int)*arrayLen);
int j=0;
for(int i=0;i<arrayLen;i++)
{
if(array[i]%2!=0)
{
arr[j++]=array[i];
}
}
for(int k=0;k<arrayLen;k++)
{
if(array[k]%2==0)
{
arr[j++]=array[k];
}
}
//*returnSize=sizeof(arr)/sizeof(arr[0]); //错误
*returnSize=arrayLen;
return arr;
free(arr);
} /**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param array int整型一维数组
* @param arrayLen int array数组长度
* @return int整型一维数组
* @return int* returnSize 返回数组行数
*
* C语言声明定义全局变量请加上static,防止重复定义
*/
int* reOrderArray(int* array, int arrayLen, int* returnSize ) {
// write code here
int j=0;
* returnSize=arrayLen;
int* s=(int*)malloc(sizeof(int)*arrayLen);
for(int i=0;i<arrayLen;i++){
if(array[i]%2==1){
s[j]=array[i];
j++;
}
}
for(int i=0;i<arrayLen;i++){
if(array[i]%2==0){
s[j]=array[i];
j++;
}
}
return s;
} int* reOrderArray(int* array, int arrayLen, int* returnSize ) {
int array2[5000] = {0};
int left = 0, right = arrayLen-1;
int i = 0, j = arrayLen-1;
while(left < arrayLen)
{
if(array[left] % 2 == 1)
array2[i++] = array[left];
//第一个元素要是奇数就放到新数组里的0下标
if(array[right] % 2 == 0)
array2[j--] = array[right];
//最后一个元素是偶就放到新数组的尾下标
left++,right--;
//不管上面判断是否进,left、right往自己的方向走
}
*returnSize = left;//最终left走到的位置就是数组的长度
return array2;
} /**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param array int整型一维数组
* @param arrayLen int array数组长度
* @return int整型一维数组
* @return int* returnSize 返回数组行数
*/
int* reOrderArray(int* array, int arrayLen, int* returnSize ) {
// write code here
*returnSize = 0;
if(arrayLen == 0) return NULL;
int *Retarray = (int*)malloc(arrayLen*sizeof(int));
memset(Retarray, 0, arrayLen);
for(int i = 0; i < arrayLen; i++)
{
if(array[i] % 2 == 1)
{
Retarray[*returnSize] = array[i];
*returnSize = *returnSize + 1;
}
}
for(int i = 0; i < arrayLen; i++)
{
if(array[i] % 2 == 0)
{
Retarray[*returnSize] = array[i];
*returnSize = *returnSize + 1;
}
}
return Retarray;
} int* reOrderArray(int* array, int arrayLen, int* returnSize ) {
int* ans = (int*) malloc(arrayLen * sizeof(int));
*returnSize = 0;
if (!ans) return NULL;
int i;
for (i = 0; i < arrayLen; ++i)
if (array[i] & 1) *(ans + (*returnSize)++) = array[i];
for (i = 0; i < arrayLen; ++i)
if (array[i] % 2 == 0) *(ans + (*returnSize)++) = array[i];
return ans;
}