《剑指Offer》读书笔记---面试题14:调整数组顺序使奇数位于偶数前面

来源:互联网 发布:cms监控软件使用说明 编辑:程序博客网 时间:2024/06/05 16:22

题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得偶数位于数组的后半部分。


一开始我是想到快速排序的Partitation函数的,所以按照快速排序的形式写了一下:

#include<cstdio>#include<iostream>const int N = 100 ;void Partitation(int *A,int p,int r) ;int main(void){int n ,i ;int A[N] ;freopen("in.txt","r",stdin) ;while(scanf("%d",&n) != EOF){for(i = 0 ; i < n ; ++i){scanf("%d",&A[i]) ;}Partitation(A,0,n) ;for(i = 0 ; i < n ; ++i){printf("%d ",A[i]) ;}printf("\n") ;}return 0 ;}//奇前偶后void Partitation(int *A,int p,int r){int x = 1 ;int i = p - 1 ;for(int j = p ; j < r ; ++j){if(1 == (A[j] & x)){i++ ;int nTemp = A[i] ; A[i] = A[j] ;A[j] = nTemp ;}}}/*********test************102 4 7 6 1 3 9 7 5 6 7 105 1 2 3 4 56 1 3 5 2 4 66 2 6 4 1 3 522 332 1 231 2 11312**************************/


而书上的另一种解法其实也是快速的Partitation,只不是另外一个版本:

大概做法就是维护两个指针,第一个指针初始化时指向数组的第一个数字,它只向后移动;第二个指针初始化时指向数组的最后一个数字,它只向前移动。在丙个指针相遇之前,第一个指针总是位于第二个指针的前面。如果第一个指针指向的数字是偶数,并且第二个指针指向的数字是奇数,我们就交换这两个数字。

void ReorderOddEven(int *pData,unsigned int length){if(pData == NULL || length == 0){return  ;}int *pBegin = pData ;int *pEnd = pData + length - 1 ;while(pBegin < pEnd){//向后移动pBegin,直到它指向偶数while(pBegin < pEnd && (*pBegin &0x1) != 0){pBegin++ ;}//向前移动pEnd,直到它指向奇数while(pBegin < pEnd && (*pEnd & 0x1) == 0){pEnd-- ;}if(pBegin < pEnd){int temp = *pBegin ;*pBegin = *pEnd ;*pEnd = temp ;}}}