基于桶的排序之计数排序
创始人
2024-02-18 04:43:58
0

基于桶的排序之计数排序

作者:Grey

原文地址:

博客园:基于桶的排序之计数排序

CSDN:基于桶的排序之计数排序

说明

基于桶的排序有两种,分别是计数排序基数排序

但是这两种排序应用范围有限,需要样本的数据状况满足桶的划分

计数排序

这个排序适用于非负数数组,如果包含负数,需要先将负数转换成正数,处理逻辑如下

如果数组最小值是负数,假设最小值为 min,则把数组中所有的数加上(-min),就转换成了非负数组,最后排序结束后,再统一减去(-min)即可。

整个排序流程如下,首先获取到整个数组的最大值,假设是 max,则可以确定,数组中的所有数都不超过 max,所以,只需要开辟一个长度为 max + 1 的数组,假设为 helper,然后遍历原始数组 arr, 将

helper[arr[i]]++

helper[i] 表示原始数组中 i 这个值出现的的次数

最后从 0 到 max 依次取出 helper 数组中的非 0 值,就是排序后的结果。

例如: arr 数组是如下数据

int[] arr = {1,4,3,3,6,4,5}

arr 中的最大值是 6,得到的 helper 数组长度是 7,每个数出现的次数记录在 helper 中以后,helper 数组如下:

int[] helper = {0,1,0,2,2,1,1}

然后找 helper 中不等于 0 的值,

helper[1] = 1; // 1 这个值出现了1次
helper[3] = 2; // 3 这个值出现了2次
helper[4] = 2; // 4 这个值出现了2次
helper[5] = 1; // 5 这个值出现了1次
helper[6] = 1; // 6 这个值出现了1次

然后按顺序依次写回 arr 中去

int[] arr = {1, 3, 3, 4, 4, 5, 6}

完整代码如下

public class Code_CountSort {// 非负数public static void countSort(int[] arr) {if (null == arr || arr.length <= 1) {return;}int max = arr[0];for (int i = 1; i < arr.length; i++) {max = Math.max(arr[i], max);}int[] help = new int[max + 1];for (int j : arr) {help[j]++;}int t = 0;for (int i = 0; i < help.length; i++) {while (help[i] != 0) {arr[t++] = i;help[i]--;}}}
}

时间复杂度为O(N),额外空间复杂度为O(M),其中 M 是数组的最大值。

更多

算法和数据结构笔记

相关内容

热门资讯

北京律师行业年均免费为群众提供... 12月19日,北京市律师协会发布《北京市律师行业社会责任报告》,展示“十四五”时期北京律师行业在履行...
分居期间男子与公司女员工不正当... 公司股东李某乙在与妻子李某甲分居期间,与公司女员工马某某存在不正当交往并育有子女,还向其大额转账。李...
男子带作弊设备考科目一,被考官... 花钱就能够通过科目一考试,前不久,一名男子轻信朋友考试“包过”承诺,带着隐蔽的作弊设备进入考场,没想...
一个月内收两封监管函,瑞茂通怎... 12月19日,瑞茂通(600180)公告,于2025年12月19日收到监管工作函,监管机构就公司信息...
律师的作用 我以前自己打官司都是当被告,想办法不让对方讹诈就行,感觉律师没啥用,只是在法庭替你发言而已,孩子谢浩...
120多万卡宴只卖60万!海南... 12月20日,话题#海南封关120多万卡宴只要60万#冲上热搜,引发公众热议。 据媒体报道,12月1...
女子醉驾找人“摆平”被骗7万后... 因醉酒驾驶轻信他人“可摆平”的谎言被骗,女子葛某乙不堪压力自杀身亡。在实施诈骗的苏某被判刑并赔偿后,...
政策护航,智能建造企业“出海”... 长沙晚报掌上长沙12月21日讯(全媒体记者 刘嘉)近日,长沙市智能建造产业链推进办公室印发了《关于推...