博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
计数排序
阅读量:3734 次
发布时间:2019-05-22

本文共 1159 字,大约阅读时间需要 3 分钟。

计数排序

1、计数排序简介

计数排序是一种基于比较的排序。它的设计思想是,通过开辟额外的一个空间,将原始数据值转化为键,按顺序取出键,即排序后的序列。

计数排序对待排序序列是有一定要求的,待排序序列必须是一个有确定范围的整数。因为计数排序的思想是将待排序序列的值映射为键,所以,必须是整数。

2、算法步骤

  1. 先遍历一遍原始序列,找出序列中的最大值。
  2. 通过最大值构建一个新的数组,记为target。
  3. 再次遍历原始序列,将原始序列的值映射到新数组target的索引,当有值映射到索引的时候,将索引对应的值加1。
  4. 最后遍历新数组target,按照索引值从小到大,如果索引对应的值不为0,就将索引值拿出来,然后索引的值-1,直到该索引值为0。

以图为例:

假设给定的初始待排序序列为

4 3 5 9 3 8 4 5 1
首先,先找出最大值,即9;
然后创建一个新的数组,长度为10,最大索引值即为9;
遍历原始数组,遍历完之后,新数组为:
0 1 0 2 2 2 0 1 1
新数组中,值不为0说明该索引在原序列中作为值出现过,索引处的元素值即表示该索引作为原序列的值出现的次数;遍历该数组即可完成排序
1 3 3 4 4 5 5 8 9

3、代码实现

public class CountingSort {	public static void countingSort(int[] arr) {		if (arr == null || arr.length == 0) {			return;		}		// 先遍历一遍原始数组,找出最大值		int max = 0, len = arr.length;		for (int i = 0; i < len; i++) {			if (arr[i] > max) {				max = arr[i];			}		}		// 定义另外一个数组,用来转化原始数组		int[] target = new int[max + 1];		// 第二遍遍历		for (int i = 0; i < len; i++) {			int val = arr[i];			target[val] = target[val] + 1;		}		// 遍历target数组,拿出全部元素		int j = 0;		for (int i = 0; i < max + 1; i++) {			int val = target[i];			while(val > 0) {				arr[j] = i;				val--;				j++;			}		}	}}

4、复杂度分析

计数排序的时间复杂度和空间复杂度均为 O ( n + k ) O(n + k) O(n+k),其中 k k k是整数的范围。

转载地址:http://kayin.baihongyu.com/

你可能感兴趣的文章
Python-Opencv学习总结(一):图像读取和获取图像特征
查看>>
C++学习总结(三):switch语句+while循环+dowhile循环
查看>>
算法打卡:力扣18 四数之和 c&&python实现
查看>>
简单题也要这么写吗??力扣 回文链表 多种判断 附解析c语言实现
查看>>
(神经网络)i7处理器日常裂开的一天:从网络爬虫到数据预测作图,基于LSTM和RNN的温度序列预测
查看>>
力扣 547. 朋友圈 c语言 三种解法 深搜 广搜 并查集。
查看>>
无代码,kmp算法,next数组的两种快速求法。
查看>>
聚类任务基础详解
查看>>
基于numpy实现的简单k-means,k-means浅析
查看>>
OpenCV初学浅记
查看>>
OpenCV初学浅记:numpy对于图像的基本操作,将数字和颜色联系起来,真有你的cv。
查看>>
机器学习:手撸id3算法,基于python的ID3决策树算法实现
查看>>
OpenCV像素点的计算,好家伙,直接降龄化教学。。。代码对图片的神奇操作~~~~~~
查看>>
OpenCV自学:ROI与泛洪填充
查看>>
python-OpenCV:模糊操作,高斯模糊,原理及其代码解析。
查看>>
win10 anconda安装 failed to create menu
查看>>
python-OpenCV自学,对高斯双边滤波,均值迁移的代码及原理浅析。
查看>>
OpenCV的几种绘图方法及其参数解释
查看>>
python-opencv:图像直方图,及其应用总结
查看>>
定位图像中子图像:直方图方向投影与图像匹配。
查看>>