Here is a C++ version of the algorithm to solve this problem.

#include <iostream>
#define TRUE 1
#define FALSE 0
typedef struct Binarr{
    int iNumber;
};

class binaryarr{
    Binarr * arr;

public:
    int iHead;
     int iSize;
    int iZeroes;
    int iOnes;
    int iTail;
    binaryarr(void);
    ~binaryarr(void);
    bool Rearrange(void);
    bool IsOdd(int iNumber);
    bool IsZero(int iNumber);
    bool SwapElements(int iUnexpected, int iCurrTail, int iExpected);
    bool ZeroOneBalanced(void);
    void Display(void);
};

void binaryarr:: Display(void){
    std::cout << std::endl << "Contents of the arr are";
    for(int j=0; j<iSize;j++)
        std::cout << std::endl<< arr[j].iNumber;
}

bool binaryarr:: ZeroOneBalanced(void){
    int iTotal = -1;
    iTotal = iOnes + iZeroes;
    if (iTotal == iSize && iOnes != iZeroes){
        std::cout << std::endl<<"Number of Ones =
"<<iOnes<<std::endl<<"Number of Zeros = "<<iZeroes;
            return FALSE; // done or error occurred.
    }
    return TRUE;
}

// Builds the arr
binaryarr::binaryarr(void){
    int iIndex = 0;


    std::cout << "Enter the size of the arr\n";
    std::cin >> iSize;

    if(iSize != 0){
        if ((iSize % 2) == 0)
        {
            std::cout << std::endl<<"Enter each zero or one and press
enter"<<std::endl;
            arr = (Binarr *) malloc(iSize-1);
            for (iIndex = 0 ; iIndex < iSize ; iIndex ++ )
                std::cin >> arr[iIndex].iNumber;
            iHead = 0;
            iTail = iSize-1;
            iZeroes = 0;
            iOnes = 0;
        }
        else
        {
            std::cout << "The size of the arr cant fit equal number of zeros
and ones\n";
            iHead = -1;
        }
    }
    else
        {
            std::cout << "The size of the arr cant fit equal number of zeros
and ones\n";
            iHead = -1;
        }

}
// Free the memory
binaryarr::~binaryarr(void){
    /*if (iHead != -1)
    free(arr);*/
}

// is the given number odd or even
bool binaryarr::IsOdd(int iNumber){
    if ( (iNumber == 0 ) )
        return TRUE;
    else
        if (( (iNumber % 2) == 0 )  && (iNumber!=1) )
        return TRUE;
    else
        return FALSE;
}

// is the given number zero or one
bool binaryarr::IsZero(int iNumber){

    if (arr[iNumber].iNumber == 0){
        iZeroes = iZeroes + 1;
        return TRUE;
    }
    else
    {
        iOnes = iOnes + 1;
        return FALSE;
    }
}

bool binaryarr:: SwapElements(int iUnexpected, int iCurrTail, int
iExpected){
    int iTemp = -1;
    int iFound = -1;
    /*while !((IsZero(iUnexpected)) && iExpected){
        iCurrTail = iCurrTail - 1;
        iFound = 1;
    }*/
    for (int iDecr = iCurrTail; iDecr >= iUnexpected; iDecr--)
    {
        if((IsZero(iDecr)) && (iExpected == 0) || (!(IsZero(iDecr))) &&
(iExpected == 1))
        {
            iFound = 1;
            iTail = iDecr; // Reposition current tail.
            iTemp = arr[iUnexpected].iNumber;
            arr[iUnexpected].iNumber = arr[iDecr].iNumber;
            arr[iDecr].iNumber = iTemp;
            return TRUE;
        }
    }
    //


    if ((iFound == -1) || (iOnes != iZeroes))
    {
        std::cout << std::endl << "binaryarr:: SwapElements: Mismatch or
mismatch in num of zeros : ones. Expected = "<<iExpected<<".Unexpected =
"<<arr[iUnexpected].iNumber;
        return FALSE;
    }

}

// sort the input arr such that every odd position has a 1 and even position
a zero.
bool binaryarr::Rearrange(void){

    for (iHead = 0; iHead < iTail; iHead++) {
        if (IsOdd(iHead)) // Determine if the position on the arr is ODD
        {
            if (IsZero(iHead)) // Position is odd; but a zero encountered
            {
                /*if (iTail == iHead)
                    iTail = iTail +1;*/
                // Expected is 1.
                if (!(SwapElements(iHead,iTail, 1))) {
                    std::cout << std::endl <<"No matching element found for
element @:"<<iHead;
                    return FALSE;
                }
                else
                    std::cout << std::endl <<"Successfully swapped between
"<<iHead<<" & "<<iTail;
            }
             // arr head is 1
        }
        else    // position is even
        {
            if (!(IsZero(iHead)))
            {
                if (!(SwapElements(iHead,iTail, 0))) {
                    std::cout << std::endl <<"No matching element found for
element @:"<<iHead;
                    return FALSE;
                }
                else
                    std::cout << std::endl <<"Successfully swapped between
"<<iHead<<" & "<<iTail;
            }
             // arr head is 0
        }

    }
    Display();
    if (!(ZeroOneBalanced()))
         return FALSE;
    return TRUE;
}

int main (int argc, char * const argv[]) {
    binaryarr test;
    if (test.iHead == -1)
        std::cout << std::endl<<"Error:Number of zeros and ones cannot be
equal with this size of arr";
    else
    {
        if (!(test.Rearrange()))
            std::cout << std::endl << "Rearrange failed";
    }
    return 0;

}

-- 
You received this message because you are subscribed to the Google Groups 
"Algorithm Geeks" group.
To post to this group, send email to algoge...@googlegroups.com.
To unsubscribe from this group, send email to 
algogeeks+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/algogeeks?hl=en.

Reply via email to