值得收藏的<计数排序>讲解

Posted 神的孩子都在歌唱

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了值得收藏的<计数排序>讲解相关的知识,希望对你有一定的参考价值。

前言:

作者:神的孩子在歌唱

大家好,我叫运智

计数排序(Counting Sort)

计数排序于1954年由Harold H. Seward提出,适合对一定范围内整数进行排序

  1. 冒泡、选择、插入、归并、快速、希尔、堆排序,都是基于比较的排序,平均时间复杂度目前最低是 O(nlogn)

  2. 计数排序、桶排序、基数排序,都不是基于比较的排序,它们是典型的用空间换时间,在某些时候,平均时间复杂度可以比 O nlogn 更低

  3. 计数排序的核心思想:统计每个整数在序列中出现的次数,进而推导出每个整数在有序序列中的索引

计数排序 – 最简单的实现

  1. 统计数组数据次数

  1. 最后输出到原来数组中覆盖就可以了

  1. 代码实现:找到最大值,开辟空间,统计次数,根据次数进行排序
package com.chengyunzhi;


public class 计数排序 {
	static int[] array= {7,3,5,8,6,7,4,5};
	public static void main(String args[]) {
		sort();
	}
	public static void sort() {
//		找出最大值
		int max=0;
		for(int arr:array) {
			max=Math.max(max, arr);
		}//O(n)
//		开辟内存空间,存每个整数出现的次数
		int[] counts=new int[max+1];
//		统计出现次数
		for(int arr:array) {
			counts[arr]++;
		}//O(n)
//		根据次数进行排序
		int index=0;
		for(int i=0;i<counts.length;i++) {
			while(counts[i]-->0) {
				array[index++]=i;
			}
		}//O(n)
		for(int i=0;i<array.length;i++) {
			System.out.print(array[i]+"_");
		}
	}
}

输出: 3_4_5_5_6_7_7_8_

时间复杂度O(n)这个版本的实现存在以下问题,无法对负整数进行排序,极其浪费内存空间,是个不稳定的排序

计数排序 – 改进思路

  1. 在{7,3,5,8,6,7,4,5}找到最大最小值,依次存入次数,就可以节省空间,并且可以对负整数进行排序

  1. 每个次数累加上其前面的所有次数得到的就是元素有序序列中的位置信息,比如元素8的次数是8=7+1,说明他前面还有七个,八的索引就是7.

    通过上面的方法知道下标就可以依次排序了

  2. 每个元素累加上其前面的所有元素得到的就是元素在有序序列中的位置信息

  1. 每个元素累加上其前面的所有元素得到的就是元素在有序序列中的位置信息

本人csdn博客:https://blog.csdn.net/weixin_46654114

转载说明:跟我说明,务必注明来源,附带本人博客连接。

以上是关于值得收藏的<计数排序>讲解的主要内容,如果未能解决你的问题,请参考以下文章

值得收藏的<冒泡排序>讲解

JS常用代码片段2-值得收藏

JS常用代码片段2-值得收藏

JS常用代码片段-127个常用罗列-值得收藏

❤️五万字《十大排序算法》动图讲解❤️(建议收藏)

❤️五万字《十大排序算法》动图讲解❤️(建议收藏)