计数排序(JAVA)
来源:互联网 发布:微商分销系统源码 编辑:程序博客网 时间:2024/06/05 01:05
计数排序是一个非基于比较的排序算法,该算法于1954年由Harold H. Seward 提出。它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法。
计数排序的基本思想是对于给定的输入序列中的每一个元素x,确定该序列中值小于x的元素的个数(此处并非比较各元素的大小,而是通过对元素值的计数和计数值的累加来确定)。一旦有了这个信息,就可以将x直接存放到最终的输出序列的正确位置上。例如,如果输入序列中只有17个元素的值小于x的值,则x可以直接存放在输出序列的第18个位置上。当然,如果有多个元素具有相同的值时,我们不能将这些元素放在输出序列的同一个位置上,因此,上述方案还要作适当的修改。
其实如果还不是很理解,那么我举一个类似的生活例子。一般的人应该都玩过斗地主,比方说你先抓牌,抓到的牌是6,你把他放在手上,再抓是5,你就会把他放在6的左边(一般人的习惯),再抓是6,这时手中已经有一个6,这个新抓到的6就要放在手中5和6的后面就是类似数组中下标为2的地方,原因是你手中小于等于6的牌有2张,所以到这儿,我们对计数排序应该有了具体的认识。
下面是我写的计数排序(JAVA版):
import java.util.Scanner;public class Main {// 计数排序// 假设数列中小于等于元素a的个数为n,则直接把a放到第n+1个位置上public void Counting_Sort(int[] A) {int max = 0;int[] B = new int[A.length]; // 存放结果的数组for (int i = 0; i < A.length; i++) {if (A[i] > max) {max = A[i]; // 得到待排数组的最大值}}System.out.println("先得到待排数组的最大元素值为:" + max);int[] C = new int[max + 1]; // 临时存储数据的数组for (int i = 0; i <= max; i++) {for (int j = 0; j < A.length; j++) {if (i == A[j]) {C[A[j]]++; // 统计相同元素的个数}}}System.out.println("统计相同元素的个数,数组C为:");for (int i = 0; i < C.length; i++) {System.out.print(C[i] + " ");}System.out.println();for (int i = 0; i <= max; i++) {for (int j = 0; j < A.length; j++) {if (A[j] < i) {C[i]++; // 统计小于的个数}}}System.out.println("统计小于元素的个数,数组C为:(这里算上了元素本身,所以下面会减去1)");for (int i = 0; i < C.length; i++) {System.out.print(C[i] + " ");}System.out.println();System.out.println();System.out.println("现在从后向前操作待排数组:");for (int j = A.length - 1; j >= 0; j--) {System.out.println("因为有" + (C[A[j]]-1) + "个小于等于" + A[j] + "的元素。");System.out.println("所以把" + A[j] + "放到第" + C[A[j]] + "个位置上。");B[C[A[j]] - 1] = A[j];C[A[j]]--; // 把每个A放到B的相应位置上for (int i = 0; i < B.length; i++) {System.out.print(B[i] + " ");}System.out.println();System.out.println();}for (int i = 0; i < A.length; i++) {A[i] = B[i];}}public static void main(String[] args) {Main test = new Main();Scanner in = new Scanner(System.in);int n = in.nextInt();int[] A = new int[n]; // 待排序的数组for (int i = 0; i < n; i++) {A[i] = in.nextInt(); // 为A数组初始化}System.out.println("计数排序开始:");long t = System.currentTimeMillis();test.Counting_Sort(A);System.out.println("排序结果为:");for (int i = 0; i < n; i++) {System.out.print(A[i] + " "); // 打印排序结果}System.out.println();System.out.println("排序加打印公共用时间:" + (System.currentTimeMillis() - t) / 1000f + "秒");}}
1 0
- 计数排序(JAVA)
- 排序算法--计数排序(java)
- 计数排序Java实现
- 计数排序-java实现
- 计数排序--Java
- 计数排序—Java
- 计数排序 java版
- Java实现计数排序
- Java实现计数排序
- java实现计数排序
- 鸽巢(计数)排序--java
- Java实现计数排序
- 【java】计数排序 基数排序
- Java 计数排序
- 计数排序java
- Java 排序之 计数排序
- JAVA 计数排序,桶排序
- 线性时间排序之计数排序(JAVA)
- 通过添加uiTOOLBAR制作毛玻璃效果
- 获取select下拉框的选中的text
- 第十二周项目1:阅读程序并写出结果(4)
- 第十一周Android学习笔记
- 通过layer设置圆角
- 计数排序(JAVA)
- Linux基本命令学习总结
- 华为OJ——字串的连接最长路径查找
- 标准C++中的string类的用法总结
- Handler消息机制 源码解读
- 算法导论之动态规划:钢条切割
- 枚举类型的使用方法
- 设置页面最小height
- 两个Activity之间利用Intent方法传递数据