【算法总结-数组】数组移动->左奇右偶

给定一个整形数组,要求对这个数组进行操作,移动成左边部分奇数,右边部分偶数的形式。

想法:快速排序的划分方法,原本是根据与某一个值进行比较进行划分。更改这个算法策略为根据每个数的奇偶性进行划分。

实现1:

 /*
  *数组移动,偶数移动到右边,奇数在左边
  *方式1:用类似与快速排序划分的方式
  *用一个指针扫描,遇到奇数就与已移动过的部分的下一个元素交换(另一个指针保存着已移动好的奇数的右边界)
  *扫描一次即可完成,时间复杂度O(N),空间O(1)
  */ 
void partition(int arr[],int n){
    int i = -1,end = n-1;
    for(int j = start;j<=end;j++){
	  if(arr[j]%2==1){
	       i++;
	       if(i!=j){
		   int temp = arr[i];
		   arr[i] = arr[j];
		   arr[j] = temp;
		}
	  }
    }
  }

实现2:

  
int partition(int arr[],int n){
    int i = 0;
    int j = n-1;
    while(i<j){
        while(i<j && (arr[i]%2==1)) i++;
        while(i<j && (arr[j]%2==0)) j--;
        if(i<j){
            swap(&arr[i],&arr[j]);
        }
    }
    return i;//返回偶数开始的索引,可以不返回

}

对于php,实现方式可以更简单,直接扫描数组,是奇数就放入左边数组left,否则放入右数组right,然后返回array_merge的结果

/*
 *方式二:对于php来说,处理方式可以更简单.
 *直接扫描数组,如果是奇数就把值放入left_array,否者放入right_array.然后返回merge的结果
 *缺点是需要O(N)的额外空间
 */
 function partition($arr){
    $left = array();
    $right = array();	
    for($j = 0;$j<count($arr);$j++){
	if($arr[$j]%2==1){
	     $left[] = $arr[$j];
	}
	else{
	     $right[] = $arr[$j];
	}
    }
    return array_merge($left,$right);
 }


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值