【排序算法】----详解计数排序算法

1.概念

计数排序是一种非比较排序,它适用于范围比较集中的数据处理。临时开辟一个数组,通过统计数据的个数,将数据集中,再将这个数组展开,实现排序的过程。
在这里插入图片描述

2.代码展示

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>

void CountSort(int *arr,int n)
{
	int max , min = arr[0];
	max = min;
	for (int i = 0; i < n; i++)
	{
		if (arr[i] > max)
		{
			max = arr[i];
		}
		if (arr[i]<=min)
		{
			min = arr[i];
		}
		
	}
	int range = max - min+1;
	int* a = (int*)malloc(sizeof(int)*range);
	for (int i = 0; i < range; i++)
	{
		a[i] = 0;
	}
	
	int count = 0;
	for (int i = 0; i < n; i++)
	{
		a[arr[i] - min ]++;
	}

	for (int i = 0; i < range; i++)
	{
		while (a[i] > 0)
		{
			arr[count] = i + min;
			count++;
			a[i]--;
		}
	}
	free(a);
}

void Print(int *arr, int n)
{
	for (int i = 0; i < n; i++)
	{
		printf("%d ",arr[i]);
	}
	printf("\n");
}
int main()
{
	int arr[] = { 9,8,8,8,8,4,4,10,10,5,6,8};
	int n = sizeof(arr) / sizeof(arr[0]);
	CountSort(arr,n);
	Print(arr, n);
	system("pause");
	return 0;
}

3.结果展示

在这里插入图片描述

4.复杂度分析

时间复杂度 O(max(N,范围))

空间复杂度 O(范围)

5.心得体会

首先就是C语言对范围检查不是很严格,我开辟数组的时候,仅仅开辟了Max-min个大小,最后也没有释放空间,但是程序可以正常运行。我通过查看内存,发现初始化的时候已经越界访问了,这样是非常不安全的,最后我加了free函数,程序才出现报错,所以对空间的检查放到了释放。我们写代码一定要注意细节。
另外我在大小比较的时候偷懒,直接用了else,导致程序出现了问题,我仔细检查后发现问题,以后真是不能偷懒,要想清楚再写出简单一点的写法,一定要细心!!!

发布了79 篇原创文章 · 获赞 6 · 访问量 3761

猜你喜欢

转载自blog.csdn.net/qq_41152046/article/details/105390169