#include <stdio.h>
#include <vector>
#include <iostream>
using namespace std;
using uint = unsigned int ;
int baseSort(vector<uint> &A, int start, int end, int bit)
{
int fromHead = start;
int fromEnd = end;
uint bitwise = 1 << bit;
printf("%s(%d):bit %d, start %d, end %d\n", __FILE__, __LINE__, bit, start, end);
while(fromHead <= fromEnd)
{
if((A[fromHead] & bitwise) == 0)
{
fromHead++;
}
else
{
if((A[fromEnd] & bitwise) == 0)
{
//exchange
uint tmp = A[fromEnd];
A[fromEnd] = A[fromHead];
A[fromHead] = tmp;
fromEnd--;
fromHead++;
}
}
if(A[fromEnd] & bitwise )
{
fromEnd--;
}
printf("%s(%d):bit %d, start %d, end %d\n", __FILE__, __LINE__, bit, start, end);
}
printf("%s(%d):bit %d\n", __FILE__, __LINE__, bit);
if((bit - 1) >= 0)
{
if((fromHead - 1 - start) > 1)
baseSort(A, start, fromHead-1, bit-1);
if((end - fromEnd - 1 ) > 1)
baseSort(A, fromEnd+1, end, bit-1);
}
return 0;
}
int main()
{
vector<uint> A;
A.resize(14);
A ={27, 17, 3, 16, 13, 10, 1, 5, 7, 12, 4, 8, 9, 0};
for(auto entry:A)
{
cout << entry<<endl;
}
printf("**************************\n");
baseSort(A, 0, A.size()-1, 31);
printf("**************************\n");
for(auto entry:A)
{
cout << entry<<endl;
}
printf("**************************\n");
return 0;
}