高等排序3—计数排序

目录

高等排序3—计数排序

        算法讲解

例题

总结


高等排序3—计数排序

        计数排序能在线性时间O(n+k)内对包含n个元素的数组进行排序,其中数组元素均大于等于0并且小于等于k。

        计数排序也成为桶排序箱排序

算法讲解

        计数排序对数组a的个元素进行排序时,先将小于或等于元素a_{i}的元素个数记录在数组b中,根据b中的值来确定a_{i}在数组c中的位置,最后输出数组c。

示例:

for (int i = 0; i < n; i++) {
		b[i] = 0;
	}

	for (int i = 0; i < n; i++) {
		b[a[i]]++;
	}

	for (int i = 1; i < max; i++) {
		b[i] += b[i - 1];
	}


	for (int i = n-1; i >=0; i--) {

		c[b[a[i]]] = a[i];
		b[a[i]]--;

	}

例题

输入n个整数,按升序排列输出。

#include<stdio.h>
#define max 999
int a[max],b[max], c[max];
int main() {

	int n;

	scanf("%d", &n);

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


	for (int i = 0; i < n; i++) {
		b[i] = 0;
	}

	for (int i = 0; i < n; i++) {
		b[a[i]]++;
	}

	for (int i = 1; i < max; i++) {
		b[i] += b[i - 1];
	}


	for (int i = n-1; i >=0; i--) {

		c[b[a[i]]] = a[i];
		b[a[i]]--;

	}

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

	return 0;

}

        从数组a的末尾开始选择,计数排序就是一种稳定的排序算法。

总结

        计数排序法只能对非负数进行排序,并且所需时间和空间于数组a中元素的最大值成正比。

计数排序能在线性时间O(n+k)内实现排序,是一种高效而稳定的算法。


读《挑战程序设计竞赛》第十六天(侵删)2021.3.10

( 2021.7.10 第一次修改)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值