计数排序(C语言实现)

算法思想

计数排序是一种非比较排序,又称为鸽巢原理,是对哈希直接定址法的变形应用。

操作步骤

  1. 统计相同元素出现次数;
  2. 根据统计的结果将序列回收到原来的序列中。
    在这里插入图片描述

计数排序的特性总结

  1. 计数排序在数据范围集中时,效率很高,但是适用范围及场景有限。
  2. 时间复杂度:O(MAX(N,range))
  3. 空间复杂度:O(range)
  4. 稳定性:稳定

代码实现

#include<stdio.h>
#include<stdlib.h>

//时间复杂度 O(N+range)
//空间复杂度 O(range)
//适合范围集中的数据,只适合整型
void countSort(int* a, int n)//计数排序 -- 非比较排序
{
   
	int maxArr = a[0], minArr = a[0];//1.求最大值和最小值
	for (int i = 0; i < n; i++)
	{
   
		if (maxArr < a[i])maxArr = a[i];
		if (minArr > a[i])minArr = a[i];
	}

	int range = maxArr - minArr + 1;//2.相对映射,开range个空间
	int* countA = (int*)calloc(range, sizeof(int));
	if (countA == NULL)
	{
   
		perror("calloc fail\n");
		exit(-1);
	}

	for (int i = 0; i < n; i++)
	{
   
		countA[a[i] - minArr]++;//3.计数
	}

	int k = 0;
	for (int j = 0; j < range; j++)
	{
   
		while (countA[j]--)//4.排序
		{
   
			a[k++] = j + minArr;
		}
	}

	for (int i = 0; i < n; i++)
	{
   
		printf("%d ", a[i]);
	}

	free(countA);
}

int main()
{
   
	int arr[] = {
    9,6,7,-1,-3,9,4,4,-1,1,-3 };
	countSort(arr, sizeof(arr) / sizeof(int));
	return 0;
}

相关推荐

  1. C语言实现冒泡排序

    2023-12-07 17:38:09       19 阅读
  2. C语言实现各种排序

    2023-12-07 17:38:09       14 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-07 17:38:09       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-07 17:38:09       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-07 17:38:09       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-07 17:38:09       20 阅读

热门阅读

  1. fastapi实现websocket在线聊天

    2023-12-07 17:38:09       44 阅读
  2. Redis雪崩

    2023-12-07 17:38:09       41 阅读
  3. 【重点】【双指针】42. 接雨水

    2023-12-07 17:38:09       41 阅读
  4. mybatis 实现批量更新的三种方式

    2023-12-07 17:38:09       28 阅读
  5. 【LVS实战】05 keepalived脑裂问题解决方案

    2023-12-07 17:38:09       28 阅读
  6. 再见了 shiro

    2023-12-07 17:38:09       36 阅读
  7. ARM Cortex-A、Cortex-M和Cortex-R简介

    2023-12-07 17:38:09       32 阅读
  8. 【ARM AMBA AXI 入门 18 - AXI4 NSAID 和 NS 详细介绍】

    2023-12-07 17:38:09       35 阅读