您的位置:首页 > 其它

计数排序和基数排序

2010-12-03 17:09 162 查看
typedef unsigned int Uint;
// ===================================================================
// 计数排序
// k: a中最大元素值+1
// 对每一个输入元素x,确定出小于x的元素个数.则x的位置在元素个数+1处
// 注意,排序后的数组b中,b[0]为空元素,实际排序好的数从b[1]开始
// ===================================================================
void counting_sort(Uint *a,Uint *b,Uint k,Uint length)
{
	Uint i,j;
	Uint *p = (Uint *)malloc(k * sizeof(Uint));	
	for(i = 0; i < k; i++)
		*(p + i) = 0;		// 数组清0
	for(j = 0; j < length; j++)
	{
		*(p + *(a + j)) += 1;
	}
	for(i = 1; i < k; i++)
	{
		*(p + i) = *(p + i) + *(p+i-1);
	}
	for(j = length -1; j != ~0; j--)  // 从大到小,可保持稳定性
	{
		*(b+ *(p + *(a + j))) = *(a + j);
		*(p + *(a + j)) -= 1;
	}
	free(p);
}

// ===================================================================
// 为基数排序准备的计数排序
// a:原数组 b: 基数组 k:b中元素最大值+1 length:a,b的长度
// 注意,排好序的数组从result[1]开始
// ===================================================================
void counting_sort_for_RS(int *a, int *b,int k,int length)
{
	int i;
	int *pCount = (int *)malloc(k * sizeof(int));  // 计数数组
	int *result = (int *)malloc((length + 1) * sizeof(int)); // 排序结果临时存储
	// clear pCount
	for(i = 0; i < k; i++)
		pCount[i] = 0;
	// count the number of pCount
	for(i = 0; i < length; i++)
	{
		pCount[b[i]]++;
	}
	// 确定不大于该位置的个数
	for(i = 1; i < k; i++)
		pCount[i] += pCount[i - 1];
	// 排序
	for(i = length -1; i >= 0; i--)
	{
		result[pCount[b[i]]] = a[i];
		pCount[b[i]]--;
	}
	// 回写到a中
	for(i = 1; i <= length; i++)
		a[i - 1] = result[i];
	free(pCount);
}
// ===================================================================
// 基数排序
// ===================================================================
void radix_sort(int *a,int length)
{
	int *pData = (int *)malloc(sizeof(int)*length);  // 保存基数
	int BaseNumber = 1;
	bool rsIsOk = 0;
	while(!rsIsOk)
	{
		rsIsOk = 1;     // 初始设置为已完成,若取基数的时候取到有不为0的数,则修改为未完成
		BaseNumber *= 10;
		for(int i = 0; i < length; i++)
		{
			pData[i] = a[i] % BaseNumber;
			pData[i] = pData[i] / (BaseNumber / 10);
			if(pData[i] > 0)
				rsIsOk = 0;		// 未完成
		}
		if(rsIsOk)
			break;
		counting_sort_for_RS(a,pData,10,length);
	}
	free(pdata);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: