非比较排序

非比较排序有: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++;
	}
}

你可能感兴趣的:(排序算法)