您的位置:首页 > 其它

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

2011-11-01 14:05 357 查看
给定一个整形数组,要求对这个数组进行操作,移动成左边部分奇数,右边部分偶数的形式。

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

实现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);
 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐