劍指offer——使數組中奇數所有位於偶數前面

從前日後找所要交換的兩個數ide

void ReOrder(int* arr, int size)
{
    if (arr == NULL || size <= 1)return;
    int i = 0,j = 0;
    while (i < size&&j < size){
        while (i < size && ((arr[i] & 0x01) == 1)){//找偶數
            ++i;
        }
        while (j < size && ((arr[j] & 0x01) == 0)){//找奇數
            ++j;
        }
        if (i < size&&j < size){
            if (i < j)//保證所找到的奇數在偶數的後面才進行交換
                swap(arr[i], arr[j]);
            else//不然繼續找下一個奇數
                ++j;
        }
    }
}



擴展性代碼函數

只須要根據不一樣的需求實現solution()方法便可,_ReorderOddEven()函數能夠被複用
it

//奇數放到偶數前面
bool solution(int n)
{
    if ((n & 0x01) == 0)//n是偶數
        return false;
    else
        return true;
}
//負數在非負數前面
bool solution2(int n)
{
    if (n < 0)
        return true;
    else
        return false;
}
//能被3整除的在前面,不能被3整除的數在後面
bool solution3(int n)
{
    if (n % 3 == 0)
        return true;
    else
        return false;
}
void _ReorderOddEven(int* arr, int size, bool(*Fun)(int))
{
    int* start = arr;
    int* end = start + size - 1;
    while (start < end){
        while (start < end && Fun(*start)){
            ++start;
        }
        while (start < end && !Fun(*end)){
            --end;
        }
        if (start < end){
            swap(*start, *end);
            ++start, --end;
        }
    }
}
void ReorderOddEven(int* arr, int size)
{
    if (arr == NULL || size <= 1)return;
    bool(*fun)(int);
    fun = &solution;
    _ReorderOddEven(arr, size,fun);
}
void ReorderOddEven2(int* arr, int size)
{
    if (arr == NULL || size <= 1)return;
    bool(*fun)(int);
    fun = &solution2;
    _ReorderOddEven(arr, size, fun);
}
void ReorderOddEven3(int* arr, int size)
{
    if (arr == NULL || size <= 1)return;
    bool(*fun)(int);
    fun = &solution3;
    _ReorderOddEven(arr, size, fun);
}
int main()
{
    /*int arr[] = { 1, 2, 3, 4, 5, 6, 20, 7, 19, 99, 100, 101 };
    ReorderOddEven(arr, sizeof(arr) / sizeof(arr[0]));
    for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); ++i){
        cout << arr[i] << " ";
    }*/

    /*int arr2[] = { -1, -5, 3, 7, 29, -4, 0, 98, -5 };
    ReorderOddEven2(arr2, sizeof(arr2) / sizeof(arr2[0]));
    for (int i = 0; i < sizeof(arr2) / sizeof(arr2[0]); ++i){
        cout << arr2[i] << " ";
    }*/

    int arr3[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    ReorderOddEven3(arr3, sizeof(arr3) / sizeof(arr3[0]));
    for (int i = 0; i < sizeof(arr3) / sizeof(arr3[0]); ++i){
        cout << arr3[i] << " ";
    }

    system("pause");
}



《完》
io

相關文章
相關標籤/搜索