非比较排序

非比较排序有:1.计数排序(适用于要排序的数的范围不大时)  ,以数组中的数据为key值,得到它们出现的次数,

                         然后根据它们出现的次数进行重新排列,得到它们的有序数列。相当于哈希表的直接定址法。

                         2.基数排序   LSD-- Least Significant Digit first 
                                             MSD-- Most Significant Digit first  , 首先根据个位的数值,在遍历数组数据时将他们 分配到0~9号的桶(个位与桶号一一对应)中,接下来将桶中按桶号由小到大一次重新收集到数组中,接着,再根据十位上的数值进行分配,重复这个过程,直到排到最大位的数据,得到有序数列。

 实现代码如下:
1.计数排序:               
void CountSort(int *a, size_t size)
{
	assert(a);
	int max = a[0];
	int min = a[0];
	for (int i = 0; i < size; i++)
	{
		if (a[i] > max)
		{
			max = a[i];
		}
		else if (a[i] < min)
		{
			min = a[i];
		}
	}
	int len = max - min + 1;
	int *countArr = new int[len];
	memset(countArr, 0, sizeof(int)*len);
	for (int i = 0; i < size; i++)
	{
		countArr[a[i] - min]++;
	}
	int tmp = 0;
	for (int i = 0; i < len; i++)
	{
		while (countArr[i]--)
		{
			a[tmp++] = i + min;
		}
	}
}

2.基数排序:
int GetMaxDigit(int *a, size_t size)
{
	int digit = 1;
	int max = 10;
	for (int i = 0; i < size; i++)
	{
		if (a[i] >= max)
		{
			digit++;
			max *= 10;
		}
	}
	return digit;
}

//基数排序
void LSDSort(int *a, size_t size)
{
	int maxdigit = GetMaxDigit(a, size);
	int *bucket = new int[size];
	int count[10];
	int start[10];
	int bit = 1;
	int digit = 1;
	while (bit <= maxdigit)
	{
		memset(count, 0, sizeof(int)* 10);
		memset(start, 0, sizeof(int)* 10);
		for (int i = 0; i < size; i++)
		{
			int num = (a[i]/digit) % 10;
			count[num]++;
		}
		start[0] = 0;
		for (int i = 1; i < size; i++)
		{
			start[i] = start[i - 1] + count[i - 1];
		}
		for (int i = 0; i < size; i++)
		{
			int num = (a[i] / digit) % 10;
			bucket[start[num]++] = a[i];
		}
		memcpy(a, bucket, sizeof(int)*size);
		digit *= 10;
		bit++;
	}
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值