给定一个整形数组,要求对这个数组进行操作,移动成左边部分奇数,右边部分偶数的形式。
想法:快速排序的划分方法,原本是根据与某一个值进行比较进行划分。更改这个算法策略为根据每个数的奇偶性进行划分。
实现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);
}