BitSort (比特排序) 适用于非负无重复数组的排序,特别是当数组元素个数较多的时候,该排序法无论在时间还是空间上都达到了很好的效果。用很小的空间实现大量数据的排序!
算法代码:
/* 算法思想: 先将待排序非负无重复数组的各个元素映射到一段内存空间的各个bit上 (若某个bit上存在相应的元素, * 则该bit置为1,否则置为0),再从低地址到高地址遍历这段内存的所有值为"1"的bit,并把它们转换成 * 相应的数值,即是待排序数组的升序序列。 * * BitSort(比特排序) --> 用很小的空间实现大量整数的排序! */ #include <iostream> using namespace std; typedef unsigned int uint; const int UINTLEN = 32; const uint FlagSet[UINTLEN] = { 0x00000001,0x00000002,0x00000004,0x00000008,0x00000010,0x00000020,0x00000040,0x00000080,0x00000100,0x00000200,0x00000400,0x00000800,0x00001000,0x00002000,0x00004000,0x00008000,0x00010000,0x00020000,0x00040000,0x00080000,0x00100000,0x00200000,0x00400000,0x00800000,0x01000000,0x02000000,0x04000000,0x08000000,0x10000000,0x20000000,0x40000000,0x80000000 }; /* "inputArr" --> 待排序非负无重复数组 * "arrLen" --> 待排序非负数组长度 * "greaterMaxKey" --> 一个比待排序非负数组中的最大元素还要大的数 * "outputArr" --> 输出 */ void BitSort(uint inputArr[],uint arrLen,uint greaterMaxKey,uint outputArr[]) { uint UINTCOUNT = (greaterMaxKey / 8) / (UINTLEN / 8); uint* uintArr = (uint*)malloc(sizeof(uint) * UINTCOUNT); memset(uintArr,sizeof(uint) * UINTCOUNT); uint offsetFlag; uint item; uint uintArrIndex; uint innerAddr; for(uint i = 0; i < arrLen; i++) { item = inputArr[i]; uintArrIndex = item / UINTLEN; innerAddr = item % UINTLEN; offsetFlag = 1; uintArr[uintArrIndex] = uintArr[uintArrIndex] | offsetFlag << innerAddr; } uint outputIndex = 0; for(uint j = 0; j < UINTCOUNT; j++) { for(uint k = 0; k < UINTLEN; k++) { item = uintArr[j] & FlagSet[k]; if(item > 0) { outputArr[outputIndex++] = j * UINTLEN + k; } } } free(uintArr); uintArr = 0; } int main(int argc,char* argv[]) { uint arr[] = {1,89,568,14,60,45,133}; uint len = 8; uint greaterMaxKey = 600; uint* result = new uint[len]; BitSort(arr,len,greaterMaxKey,result); for(uint i = 0; i < len; i++) { cout<<result[i]<<" "; } cout<<endl; delete[] result; result = 0; system("pause"); return 0; }