不知道为什么,突然编辑器不支持颜色丰富的intellij IDEA直接复制了,博主有点沮丧,因此我先用图片的形式展示并分析,然后在最后会将全部代码呈上

排序思想:在一个数组中,对于每一个数据,都统计有多少个数字小于它,就能反应出它当前所在的位置

比如 [0,1,1,2] 这个数组中,'0'就有0个元素小于它,'2'就有3个元素小于它,而对于'1',则有2个元素小于它.

从以下方面不断进步着:

  1. 基础代码
  2. 一次改进,将排序适配范围扩大
  3. 二次改进,更舒服的使用这个算法
  4. 全部代码
一.基础代码
二.一次改进,将排序适配范围扩大
在这里,将适配范围增加,但是遗憾的是依旧只能对正整数进行排序
三.二次改进,更舒服的使用这个算法

四.全部代码
package com.sort;/*** 计数排序* 对于每一个数据,统计整个数组中有多少小于它的数,这样就可以确定它的位置.* 比如 : 比它小的有17个,那么它就应该在第18位上*/
public class CountingSort {public static int[] countingSort_1(int[] arr) {//找到整个数组中的最大值int max = arr[0];for (int anArr : arr) {if (max < anArr) {max = anArr;}}int[] result = new int[arr.length]; //作为排序完成的数组int[] temp = new int[max + 1];  //用于保存临时数据// 这里将 temp 的下标作为待排数组中的数值,而它对应的元素作为这个数值在数组中的频数for (int i = 0; i < arr.length; i++) {temp[arr[i]] = temp[arr[i]] + 1;}// 更新 temp 数组,将它存储的元素表示为:有多少元素小于(或等于)当前下标的值for (int i = 1; i <= max; i++) {temp[i] += temp[i - 1];}//将结果输出到 result[] 中for (int i = arr.length - 1; i >= 0; i--) {result[temp[arr[i]] - 1] = arr[i];temp[arr[i]] = temp[arr[i]] - 1;}return result;}/*改进1:* 观察上述代码,很明显能得到,上面真正能够执行的情况仅能排序的区间是 [ 1 , max ]* 局限性很大,因此这里进行改进* 改进后的排序算法可以排序的区间是 [ min , max ]*///传递进来两个参数,说明排序区间为 [ min , max ]public static int[] countingSort_2(int[] arr, int min, int max) {//已经得到了整个数组中的最大值 maxint[] result = new int[arr.length]; //作为排序完成的数组int[] temp = new int[max - min + 1];  //用于保存临时数据// 这里将 temp 的下标作为待排数组中的数值,而它对应的元素作为这个数值在数组中的频数for (int i = 0; i < arr.length; i++) {temp[arr[i] - min] = temp[arr[i] - min] + 1;}// 更新 temp 数组,将它存储的元素表示为:有多少元素小于(或等于)当前下标的值for (int i = 1; i <= max - min; i++) {temp[i] += temp[i - 1];}//将结果输出到 result[] 中for (int i = arr.length - 1; i >= 0; i--) {result[temp[arr[i] - min] - 1] = arr[i];temp[arr[i] - min] = temp[arr[i] - min] - 1;}return result;}/*改进2:* 这次改进的不是代码本身,而是操作习惯.* 一般而言,当我想调用一个数组对他进行排序的时候,通常不会而且不想知道它的最小值和最大值,* 因此找到最小值和最大值的这一步需要我们用代码实现** 改进之后,可以直接传入数组进行排序*/public static int[] countingSort_3(int[] arr) {int min = arr[0], max = arr[0];for (int anArr : arr) {if (anArr > max) {max = anArr;} else if (anArr < min) {min = anArr;}}return countingSort_2(arr, min, max);}
}

排序算法(6)----计数排序相关推荐

  1. 排序算法之计数排序、基数排序和桶排序

    转自:http://www.cnblogs.com/ttltry-air/archive/2012/08/04/2623302.html 计数排序,基数排序,桶排序等非比较排序算法,平均时间复杂度都是 ...

  2. 【排序算法】计数排序引发的围观风波——一种O(n)的排序

    前言 计算机课上,老师给一串数字6 1 6 9 9 1 4 2 1 5 8 8,问道:这一串数字,你们写个程序给我看,要求效率较高.学不出来的别下课了. 顿时场下一片哗然,但有很多小朋友硬着头皮啪啪啪 ...

  3. java sorted排序_【算法】排序算法之计数排序

    前几回,我们已经对冒泡排序.直接插入排序.希尔排序.选择排序.快速排序.归并排序.堆排序做了说明分析.本回,将对计数排序进行相关说明分析. 一.排序算法系列目录说明 冒泡排序(Bubble Sort) ...

  4. c++ 二维数组 排序_【算法】排序算法之计数排序

    前几回,我们已经对[算法]排序算法之冒泡排序.[算法]排序算法之插入排序.[算法]排序算法之希尔排序.[算法]排序算法之选择排序.[算法]排序算法之快速排序.[算法]排序算法之归并排序.[算法]排序算 ...

  5. 【排序算法】计数排序

    当输入的元素是 n 个 0 到 k 之间的整数时,它的运行时间是 Θ(n + k).计数排序不是比较排序,排序的速度快于任何比较排序算法. 由于用来计数的数组B的长度取决于待排序数组中数据的范围(等于 ...

  6. Python排序算法之计数排序

    目录 简介 代码示例 简介 已知列表的元素范围在0到100,设计一个复杂度为O(n)的算法在类似这种情况下,计数排序比sorted还要快 代码示例 #!/usr/bin/python3 # -*- c ...

  7. 排序算法:计数排序(Python)

    思路:计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中.作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数. 一图解百惑,上图!  话不多说,上代码! def ...

  8. [Alg]排序算法之分布排序

    [Alg]排序算法之分布排序 作者:屎壳郎 日期:Aug 2021 版次:初版 简介: 分布排序是与归并排序截然相反的处理思路,归并排序是逐步融合归并,而分布排序是分组然后合并,再分组再合并,所以分布 ...

  9. 排序算法:桶排序、计数排序、基数排序

    相关博客: 排序算法:冒泡排序.插入排序.选择排序.希尔排序 排序算法:归并排序.快速排序 排序算法:桶排序.计数排序.基数排序 排序算法:堆排序 十大排序算法小结 这篇博客将主要介绍三种时间复杂度是 ...

最新文章

  1. vSphere企业运维:从入门到提高【学习路线图】
  2. 如何让gridview中的checkbox根据数据库情况默认选中?
  3. 重磅发布!最新版《动手学深度学习》PDF 版今天终于可以下载
  4. Spring自定义注解简单使用四步走
  5. 机器学习之决策树的原理及sklearn实现
  6. 【C语言简单说】七:自定义函数(3)
  7. android自定义弹出对话框,使用FlyDialog实现自定义Android弹窗对话框
  8. 字符串矩阵转换成长字符串_字符串矩阵
  9. 身份认证与访问管理护航云安全
  10. 软件度量五步法包括_软件交付效能度量——从吞吐量和稳定性开始
  11. c语言单片机程序设计例,单片机 C语言 程序设计100例
  12. 刷机工具-fastboot
  13. AI和人工智能入门级视频
  14. usb无线网卡安装在服务器上,外置无线网卡怎么安装_外置无线网卡怎么用-win7之家...
  15. 墨者 SQL手工注入漏洞测试(MySQL数据库)
  16. 各台平台电商API接口吊桶,API接口分类
  17. 使用Python库valuequant和利润表历史数据计算股权价值
  18. Android手机如何修改DPI触发平板模式
  19. Tableau图表 | 6、气泡图/树状图/文字云
  20. 【无2022起重信号司索工(建筑特殊工种)考试题模拟考试题库及模拟考试

热门文章

  1. 使用Metal打造令人惊叹的游戏效果
  2. 微异构Embree照片级光线追踪解决方案
  3. python---内置模块
  4. [SDK2.2]Windows Azure Storage (16) 使用WCF服务,将本地图片上传至Azure Storage (上) 客户端代码...
  5. 可执行镜像——开发环境的Docker化之路
  6. 改变你一生命运的话语 不得不信
  7. nginx 优化(突破十万并发)
  8. 中国电信 商务领航送的cisco nav-10 wf配置端口转发
  9. python 字符串find方法怎么用_Python字符串find()方法
  10. oracle flash_cache,11gR2新特性之二 - Flash Cache 的SSD支持