【数据结构】计数排序——不需要比较的排序

计数排序只能用于整数,

计数排序函数的参数有俩个:

一个是要进行处理操作的数组,

另一个参数是数组中元素的个数

  • 【思路】:

【数据结构】计数排序——不需要比较的排序_第1张图片

因为是根据数组下标的相对位置取代替比较操作的,所以要 malloc 一个数组;

但是要想确定 malloc 出空间的具体大小时,

就要先在传入函数的数组中寻找最大的元素与最小的元素,二者的差再加上1,

即确定了可以容纳这些数组中全部的元素,

尽管可能会出现一些空间的剩余,但是无关紧要。

分配好数组后不要忘记要初始化,将里面的元素全部初始化为 0;

这里的初始化很重要,

因为数组中的数据都是连续存放的,

  • 注意:

这里的相对位置是指:

原数组中的数据(a[ i ])减去原数组中最小的那个数( min ),

得到的数字便是 malloc 后空间中的位置 count + (a[ i ] - min),

这里的位置只会存放其所对应的原数组中那个数据的个数,并不会存放其原数组中的数据

而且根据大的数字减去 min 得到的值更大,那么它的相对位置相较于小的数字的位置更靠后,从而判别出了数的大小

在统计好 malloc 所分配的空间中的相对位置上的原数组中每一个数据的个数后,

就要在原数组中(注意是在原数组中)从第一个位置根据 malloc 数组空间内的个数依次进行重新的赋值;

为了在原数组中从第一个位置依次向后开始赋值,需要创建一个变量加以解决

而这时原数组中的数据其实无关紧要,

而且数据之间的大小关系也根据其相对位置进一步的敲定;

我们可以通过 malloc 数组空间内的 相对位置 与 其相对位置对应的数据个数 和 原数据中的最小值

推断出原数组中的各个位置应该存放相应大小的数字:

即 : malloc 数组空间的每一个位置坐标 加上 最小值,

此时统计好的数据个数是作为 while 循环的判定条件所存在的,

而当遇到有多个数字时,因为有 while 循环的判定条件和保证原数组空间从头开始存放数据所创建的变量 保证,不必担心少放的问题

  • 易错点:【数据结构】计数排序——不需要比较的排序_第2张图片

 

代码实现:

//计数排序:
/*适用于数据之间的范围不大,但是数的大小较为集中的数列排序*/

/* 时间复杂度:O(max(range, N))
 空间复杂度:O(range)*/
void CountSort(int* a, int n)
{
	int min = a[0], max = a[0];
	for (int i = 1; i < n; ++i)
	{
		if (a[i] < min)
			min = a[i];

		if (a[i] > max)
			max = a[i];
	}

	// 统计次数的数组
	int range = max - min + 1; //减去 min 是关键,即是相对映射
	
	int* count = (int*)malloc(sizeof(int)*range);//开辟数列中最大数值个空间
	
	if (count == NULL)
	{
		printf("malloc fail\n");
		exit(-1);
	}
	
	memset(count, 0, sizeof(int)*range);//对 count 数组进行初始化,使其数组中的每个值均为 0

	// 统计次数:
	/*根据原数组中的数据在 malloc 数组中的相对位置来统计原数组中每一个数字所出现的个数,
	当有一个数字出现多次时,不管这多个数字位于原数组中的哪一个位置,因为它们都与 min 的差相同,
	即都在同一相对位置中。*/
	for (int i = 0; i < n; ++i)//遍历的是原数组
	{
		count[a[i] - min]++; //count 是动态内存开辟出来的数组
		/*[a[i]-min] 是相对映射的位置*/
	}

	// 向原数组回写-排序
	int j = 0;//创建该变量的目的便是要在原数组中从头开始更换其元素之间的位置
	
	for (int i = 0; i < range; ++i)/*时间复杂度取决于这里的 range 上面循环中的 n;
								   而且这一次遍历的是 malloc 出来的那个数组;
								   故要注意其遍历的出口条件需要改变。*/
	{
		// 出现几次就会回写几个 i+min
		while (count[i]--)
		{
			a[j++] = i + min;//后置++,是要在原数组中进行数据与数据之间位置的改动
		}
	}
}

你可能感兴趣的:(数据结构,排序算法,算法,计数排序,数据结构,leetcode)