鱼C论坛

 找回密码
 立即注册
查看: 2810|回复: 4

[技术交流] 905_按奇偶排序数组

[复制链接]
发表于 2019-6-17 10:17:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
/*

给定一个非负整数数组 A,返回一个数组,在该数组中, A 的所有偶数元素之后跟着所有奇数元素。

你可以返回满足此条件的任何数组作为答案。

 

示例:

输入:[3,1,2,4]
输出:[2,4,3,1]
输出 [4,2,3,1],[2,4,1,3] 和 [4,2,1,3] 也会被接受。

 

提示:

    1 <= A.length <= 5000
    0 <= A[i] <= 5000
*/


/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* sortArrayByParity(int* A, int ASize, int* returnSize){
    
    int* ret_val        = (int*)calloc(sizeof(int)*ASize);
    int* pointer_head   = NULL;
    int* pointer_tail   = NULL;
    int  i              = 0;
    
    if(ret_val==NULL)
    {
        *returnSize = 0;
        return NULL;
    }
    pointer_head = ret_val;
    pointer_tail = &ret_val[ASize-1];

    for(i=0;i < ASize ; i ++)
    {
        if(A[i] % 2 == 0)
        {
            *pointer_head = A[i];
            pointer_head ++ ;
            
        }
        else
        {
            *pointer_tail = A[i];
            pointer_tail -- ;
        }
    }
    
    
    *returnSize = ASize;
    return ret_val;
}



/*
方案1:
执行用时 :64 ms, 在所有C提交中击败了25.23%的用户
内存消耗 :10.4 MB, 在所有C提交中击败了77.94%的用户
*/


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-6-17 10:20:30 | 显示全部楼层
方法1.遍历原数组,逐一从头尾插入。。。


方法2.可以不遍历,直接从头尾开始判断,遇到不合适的就交换.
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* sortArrayByParity(int* A, int ASize, int* returnSize){
    
    int* ret_val        = (int*)malloc(sizeof(int)*ASize);
    int* pointer_head   = NULL;
    int* pointer_tail   = NULL;
    int  tmp            = 0;
    
    memcpy(ret_val,A,sizeof(int)*ASize);
    if(ret_val==NULL)
    {
        *returnSize = 0;
        return NULL;
    }
    
    pointer_head = ret_val;
    pointer_tail = &ret_val[ASize-1];
    while(pointer_head < pointer_tail)
    {
        if((*pointer_head % 2 == 1)&&(*pointer_tail % 2 == 0))
        {
            tmp           = *pointer_tail;
            *pointer_tail = *pointer_head;
            *pointer_head = tmp;
        }
        
        if(*pointer_head % 2 == 0)
        {
            pointer_head ++;
        }
        
        if(*pointer_tail % 2 == 1)
        {
            pointer_tail --;
        }   
    }
    
    *returnSize = ASize;
    return ret_val;
}
/*
方案2:
执行用时 :52 ms, 在所有C提交中击败了30.37%的用户
内存消耗 :10.2 MB, 在所有C提交中击败了84.56%的用户
*/

貌似没有显著的改善.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-17 10:38:56 | 显示全部楼层
方法3:使用位运算做奇偶判断,二进制整数的奇偶性完全由第0位确定。


/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* sortArrayByParity(int* A, int ASize, int* returnSize)
{
    
    int* ret_val        = (int*)malloc(ASize*sizeof(int)) ;
    int* pointer_head   = NULL;
    int* pointer_tail   = NULL;
    int  tmp            = 0;
    
    memcpy(ret_val,A,ASize*sizeof(int));
    
    
    pointer_head = ret_val;
    pointer_tail = &ret_val[ASize-1];
    while(pointer_head < pointer_tail)
    {
        if(  ( ((*pointer_head) & 1) == 1 )
           &&( ((*pointer_tail) & 1) == 0  )
        )
        {
            tmp           = *pointer_tail;
            *pointer_tail = *pointer_head;
            *pointer_head = tmp;
        }
        
        if( ((*pointer_head) & 1) == 0)
        {
            pointer_head++;
        }
        
        if( ((*pointer_tail) & 1) == 1)
        {
            pointer_tail --;
        }   
    }
    *returnSize = ASize;
    return ret_val;
}

排名有明显改善.
/*
使用位
执行用时 :40 ms, 在所有C提交中击败了92.52%的用户
内存消耗 :10.2 MB, 在所有C提交中击败了83.82%的用户
*/
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-17 14:43:55 | 显示全部楼层
风扫地 发表于 2019-6-17 10:38
方法3:使用位运算做奇偶判断,二进制整数的奇偶性完全由第0位确定。

函数的第三个参数,int* returnsize的初始值要怎么给呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-17 14:54:30 | 显示全部楼层
Seawolf 发表于 2019-6-17 14:43
函数的第三个参数,int* returnsize的初始值要怎么给呢

其实就是 ASize啊。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 03:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表