BitSort (比特排序)

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;
}

相关文章

文章浏览阅读903次。文章主要介绍了收益聚合器Beefy协议在币...
文章浏览阅读952次。比特币的主要思路是,构建一个无中心、去...
文章浏览阅读2.5k次。虚拟人从最初的不温不火,到现在步入“...
文章浏览阅读1.3k次,点赞25次,收藏13次。通过调查和分析用...
文章浏览阅读1.7k次。这个智能合约安全系列提供了一个广泛的...
文章浏览阅读1.3k次。本文描述了比特币核心的编译与交互方法...