位向量实现1000万无重复整数的排序
原书代码如下:
#include <iostream> #include <math.h> #include <time.h> #define BITSPERWORD 32 #define SHIFT 5 #define MASK 0x1F #define M 100 #define N 10000000 int a[1+N/BITSPERWORD]; void set(int i) { a[i>>SHIFT] |= (1<<(i & MASK)); } void clr(int i) { a[i>>SHIFT] &= ~(1<<(i & MASK)); } int test(int i) { return a[i>>SHIFT] & (1<<(i & MASK)); } int myRand()//产生一个0~N之间的随机数 { int num; num = rand()%N; return num; } int main() { int i; int bitsort[M]; for (i=0;i<N;i++) clr(i); // while( scanf("%d",&i) != EOF ) // set(i); srand((unsigned)time(NULL)); printf("The original items of array[%d] are:\n",M); for (int j=0;j<M;j++) { bitsort[j] = myRand(); printf(" %d",bitsort[j]); set(bitsort[j]); } printf("\n"); printf("The sorted items of array[%d] are:\n",M); for (i=0;i<N;i++) { if (test(i)) { printf(" %d",i); } } printf("\n"); return 0; }
另外,在STL中也有相应函数,示例代码如下(师弟提供)
#include <bitset> const int iMaximumValue=99, iMinimumValue=0; void BitSetSort(int *piArray, size_t uiCount){ std::bitset<iMaximumValue-iMinimumValue+1> bsSort; for(size_t uiIndex=0; uiIndex<uiCount; uiIndex++){ bsSort.set(static_cast<size_t>(piArray[uiIndex]-iMinimumValue)); } for(size_t uiIndex=0; uiIndex<bsSort.size(); uiIndex++){ if(bsSort.test(uiIndex)){ *piArray=static_cast<int>(iMinimumValue+uiIndex); piArray++; } } } int wmain(int argc, wchar_t **argv, wchar_t envp){ int ai[20]={ 5, 35, 4, 78, 22, 48, 75, 3, 0, 58, 33, 64, 79, 21, 11, 6, 77, 20, 9, 10 }; BitSetSort(ai, 20); for(int iIndex=0; iIndex<20; iIndex++){ std::wcout<<ai[iIndex]<<L' '; } return EXIT_SUCCESS; }