Java实现计数排序

详细讲解见《算法导论》8.2节——计数排序。

Java代码如下:

package linetimesort;
/**
 * 计数排序假设n个输入元素中的每一个都是介于0到k之间的某个整数,k为某个整数;它
 * 通过确定小于等于一个数的数的个数来确定这个数应该放在哪个位置
 * @author yuncong
 *
 */
public class CountSort {
	/**
	 *
	 * @param a 排序前的数组
	 * @param b 排序后的数组
	 * @param k 排序数组中最大元素的值
	 */
	public void sort(int[] a, int[] b, int k){
		// 创建数组c,并初始化
		int[] c = new int[k + 1];
		for (int i = 0; i < c.length; i++) {
			c[i] = 0;
		}
		// 统计数组a中每个元素出现的次数
		for (int i = 0; i < a.length; i++) {
			c[a[i]]++;
		}
		/**
		 * 统计数组a中小于等于某一个数的数的个数;
		 * 因为小于等于0的数的个数就是等于0的数的个数,所迭代从1开始
		 */
		for (int i = 1; i < c.length; i++) {
			c[i] = c[i] + c[i - 1];
		}
		for (int i = 0; i < a.length; i++) {
			/**
			 * 小于等于a[i]的数的个数为x就应该将该数放在数组b的第x-1个位置,
			 * 因为数组的下标从0开始
			 */
			b[c[a[i]] - 1] = a[i];
			/**
			 * 下一个a[i]排在这个a[i]的前面;
			 * 下一个a[i]排在前面的原因是前面为所有小于等于a[i]的数留足了空间
			 */
			c[a[i]]--;
		}
	}

	public static void main(String[] args) {
		int[] a = new int[]{3, 1, 14, 5, 6};
		int[] b = new int[5];
		new CountSort().sort(a, b, 14);
		for (int i = 0; i < b.length; i++) {
			System.out.println(b[i]);
		}
	}

}
时间: 2024-08-08 09:41:58

Java实现计数排序的相关文章

基本排序Java实现(3)—— 计数排序

计数排序是线性排序. 升序排序: public void sortByAsc(int[] data) { if(data == null || data.length <= 1) return; /** find the range of data */ int range = data[0]; for(int i = 1; i< data.length; i++){ if(range < data[i]){ range = data[i]; } } if (range <= 0)

算法-java代码实现计数排序

计数排序 第10节 计数排序练习题 对于一个int数组,请编写一个计数排序算法,对数组元素排序. 给定一个int数组A及数组的大小n,请返回排序后的数组. 测试样例: [1,2,3,5,2,3],6 [1,2,2,3,3,5] Java (javac 1.7) 代码自动补全 1 import java.util.*; 2 3 public class CountingSort { 4 public int[] countingSort(int[] A, int n) { 5 countingSo

计数排序Java代码实现

结论:由于计数排序不是基于比较的排序,所以时间复杂度可以突破O(nlgn);计数排序时间复杂度为O(n),额外空间复杂度为O(n); Java实现代码如下: 1 package com.cmbc.test1; 2 3 public class CountSorting { 4 5 public static void countSort(int[] arr){ 6 if(arr==null||arr.length<2){ 7 return; 8 } 9 int max = Integer.MIN

Java实现堆排序和计数排序

堆排序代码: import java.util.Arrays; /** * 思路:首先要知道大顶堆和小顶堆,数组就是一个堆,每个i节点的左右孩子是2i+1和2i+2 * 有了堆,将其堆化:从(n/2)-1个元素开始向下修复,将每个节点修复为小(大)顶堆 * 修复完成后,数组具有小(大)顶堆的性质 * 按序输出:小顶堆可以对数组逆序排序,每次交换堆顶和末尾元素,对堆顶进行向下修复,这样次小元素又到堆顶了 * * 时间复杂度:堆化:一半的元素修复,修复是单分支的,所以整体堆化为nlgn/2 * 排序

算法笔记_129:计数排序(Java)

目录 1 问题描述 2 解决方案 2.1比较计数排序 2.2 分布计数排序   1 问题描述 给定一组数据,请使用计数排序,得到这组数据从小到大的排序序列. 2 解决方案 2.1比较计数排序 下面算法的时间复杂度为O(n^2),空间复杂度为O(n).此方法对于任意一组数据均可排序. 具体代码如下: package com.liuzhen.practice; public class Main { public void comparisonCountingSort(int[] A) { int[

Java实现基于桶式排序思想和计数排序思想实现的基数排序

计数排序 前提:待排序表中的所有待排序关键字必须互不相同: 思想:计数排序算法针对表中的每个记录,扫描待排序的表一趟,统计表中有多少个记录的关键码比该记录的关键码小,假设针对某一个记录,统计出的计数值为c,则该记录在新的有序表中的存放位置即为c. 性能:空间复杂度:o(n):时间复杂度:o(n^2): 1 public int[] countSort(int[] array){ 2 int[] tempArray = new int[array.length]; //引入辅助数组 3 for(i

hdu---(1280)前m大的数(计数排序)

前m大的数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 10633    Accepted Submission(s): 3707 Problem Description 还记得Gardon给小希布置的那个作业么?(上次比赛的1005)其实小希已经找回了原来的那张数表,现在她想确认一下她的答案是否正确,但是整个的答案是很庞大的表,小希

计数排序(counting-sort)&mdash;&mdash;算法导论(9)

1. 比较排序算法的下界 (1) 比较排序     到目前为止,我们已经介绍了几种能在O(nlgn)时间内排序n个数的算法:归并排序和堆排序达到了最坏情况下的上界:快速排序在平均情况下达到该上界.     如果仔细观察,我们会发现:在排序的最终结果中,各元素之间的次序依赖于它们之间的比较.我们把这类排序算法统称为比较排序.到目前为止我们介绍的排序算法都是比较排序.下面我们来论证一个事实:任何比较排序算法在最坏情况下都要经过Ω(n lgn)次比较. (2) 决策树模型     在证明之前,我们先介

【算法导论学习-014】计数排序(CountingSortTest)

参考:<算法导论>P194页 8.2节 Counting sort 1.Counting sort的条件 待排序数全部分布在0~k之间,且k是已知数:或者分布在min~max之间,等价于分布在0~max-min之间,max和min是已知数. 2.java 实现 /** * 创建时间:2014年8月17日 下午3:22:14 项目名称:Test * * @author Cao Yanfeng * @since JDK 1.6.0_21 类说明: 计数排序法,复杂度O(n), 条件:所有数分布在0