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

来源:互联网 发布:恢复断开的网络驱动器 编辑:程序博客网 时间:2024/06/05 18:59

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

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

实现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); }


原创粉丝点击