计数排序(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
原创粉丝点击