C语言:Count Sorting(计数排序)

// Count Sorting(计数排序):
// 通过计数而不是比较来进行排序
// 适用于范围较小的整数序列
#include
#include
#include

// 打印数组
void Print_arr(int arr[], int len)
{
	for (int i = 0; i < len; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}

void Count_Sorting(int arr[], int len)
{
	if (len < 1)
		return;

	// 寻找最大元素
	int max = arr[0];
	for (int i = 1; i < len; i++)
	{
		if (arr[i] > max)
		{
			max = arr[i];
		}
	}

	// 分配一个长度为max+1的数组存储计数,并初始化为0
	int* count = (int*)malloc(sizeof(int) * (max + 1));
	memset(count, 0, sizeof(int) * (max + 1));

	// 计数
	for (int i = 0; i < len; i++)
	{
		count[arr[i]]++;
	}
		
	// 统计计数的累计值
	for (int i = 1; i < max + 1; i++)
	{
		count[i] += count[i - 1];
	}

	// 创建一个临时数组保存结果
	int* output = (int*)malloc(sizeof(int) * len);

	// 将元素放到正确的位置上
	for (int i = 0; i < len; i++)
	{
		output[count[arr[i]] - 1] = arr[i];
		count[arr[i]]--;
	}

	// 将结果复制回原数组
	for (int i = 0; i < len; i++)
	{
		arr[i] = output[i];
	}

	// 释放内存空间
	free(count);
	free(output);
}

int main()
{
	int arr[] = { 4,5,8,2,1,3,7,6,2 };

	printf("排序前:\n");
	Print_arr(arr, 9);

	Count_Sorting(arr, 9);

	printf("排序后:\n");
	Print_arr(arr, 9);

	return 0;
}

输出结果如下:

C语言:Count Sorting(计数排序)_第1张图片

你可能感兴趣的:(c语言,排序算法,算法)