Java实现计数排序
1 问题描述
给定一组数据,请使用计数排序,得到这组数据从小到大的排序序列。
2 解决方案
2.1比较计数排序
下面算法的时间复杂度为O(n^2),空间复杂度为O(n)。此方法对于任意一组数据均可排序。
package com.liuzhen.practice;
public class Main {
public void comparisonCountingSort(int[] A) {
int[] temp = new int[A.length];
int[] count = new int[A.length];
for(int i = 0;i < A.length - 1;i++) {
for(int j = i + 1;j < A.length;j++) {
if(A[i] < A[j])
count[j]++;
else
count[i]++;
}
}
for(int i = 0;i < A.length;i++)
temp[count[i]] = A[i];
for(int i = 0;i < A.length;i++)
A[i] = temp[i];
return;
}
public static void main(String[] args) {
Main test = new Main();
int[] A = {2,3,1,4,6,4,3,5,3,2,5,3,5,2,3,4,5,2,54,3,21};
test.comparisonCountingSort(A);
for(int i = 0;i < A.length;i++)
System.out.print(A[i]+" ");
}
}
运行结果:
1 2 2 2 2 3 3 3 3 3 3 4 4 4 5 5 5 5 6 21 54
2.2 分布计数排序
下面算法的时间复杂度为O(n),空间复杂度为O(n)。该方法的时间效率要优于快速排序和合并排序,但是此方法对于给定数据有一定的要求,即数组中元素满足min <= A[i] <= max,且在min ~ max之间的所有元素在数组A中均有出现。
package com.liuzhen.practice;
public class Main1 {
//数组A中所有均大于等于min,小于等于max,并且min~max之间的所有元素在数组A中均出现
public void distributionCountingSort(int[] A, int min, int max) {
int[] temp = new int[A.length];
int[] D = new int[max - min + 1];
for(int i = 0;i < A.length;i++)
D[A[i] - min]++;
for(int i = 0;i < max - min;i++)
D[i + 1] = D[i + 1] + D[i];
for(int i = 0;i < A.length;i++) {
int j = A[i] - min;
temp[D[j] - 1] = A[i];
D[j]--;
}
for(int i = 0;i < A.length;i++)
A[i] = temp[i];
return;
}
public static void main(String[] args) {
Main1 test = new Main1();
int[] A = {1,2,3,4,5,6,7,8,9,2,4,5,4,3,4,5,2,3,4,5,2,3,5,4,2,3,5,4,3,2,5,3,3,5};
test.distributionCountingSort(A, 1, 9);
for(int i = 0;i < A.length;i++)
System.out.print(A[i]+" ");
}
}
运行结果:
1 2 2 2 2 2 2 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 6 7 8 9
Java实现计数排序的更多相关文章
- 计数排序详解以及java实现
前言 我们知道,通过比较两个数大小来进行排序的算法(比如插入排序,合并排序,以及上文提到的快速排序等)的时间复杂度至少是Θ(nlgn),这是因为比较排序对应的决策树的高度至少是Θ(nlgn),所以排序 ...
- 算法-java代码实现计数排序
计数排序 第10节 计数排序练习题 对于一个int数组,请编写一个计数排序算法,对数组元素排序. 给定一个int数组A及数组的大小n,请返回排序后的数组. 测试样例: [1,2,3,5,2,3], ...
- Java实现堆排序和计数排序
堆排序代码: 思想:每次都取堆顶的元素,将其放在序列最后面,然后将剩余的元素重新调整为最小堆,依次类推,最终得到排序的序列. import java.util.Arrays; /** * 思路:首先要 ...
- 排序基础之非比较的计数排序、桶排序、基数排序(Java实现)
转载请注明原文地址: http://www.cnblogs.com/ygj0930/p/6639353.html 比较和非比较排序 快速排序.归并排序.堆排序.冒泡排序等比较排序,每个数都必须和其他 ...
- 排序算法-计数排序(Java)
package com.rao.sort; import java.util.Arrays; /** * @author Srao * @className CountSort * @date 201 ...
- Java排序之计数排序
Java排序之计数排序 计数排序思路 计数排序适用于有明确范围的数组,比如给定一个数组,且知道所有值得范围是[m,n].这个时候可以使用一个n-m+1长度的数组,待排序的数组就可以散在这个数组上,数组 ...
- 计数排序和桶排序(Java实现)
目录 比较和非比较的区别 计数排序 计数排序适用数据范围 过程分析 桶排序 网络流传桶排序算法勘误 桶排序适用数据范围 过程分析 比较和非比较的区别 常见的快速排序.归并排序.堆排序.冒泡排序等属于比 ...
- 计数排序-java
今天看了一本书,书里有道题,题目很常见,排序,明了点说: 需求:输入:最多有n个正整数,每个数都小于n, n为107 ,没有重复的整数 输出:按升序排列 思路:假设有一组集合 {1,3,5,6,11, ...
- 桶排序和计数排序的理解实现和比较(Java)
比较和非比较的区别 常见的快速排序.归并排序.堆排序.冒泡排序等属于比较排序.在排序的最终结果里,元素之间的次序依赖于它们之间的比较.每个数都必须和其他数进行比较,才能确定自己的位置.比较排序的优势是 ...
随机推荐
- 日志系列1——slf4j日志框架原理
目录 1.前言 2.日志门面 3.日志库 4.日志适配器 5.日志库的选用 6.logback.xml 配置文件 1.前言 说到日志工具,日常工作或学习中肯定听过这些名词:log4j.logbac ...
- python循环中对一个列表的赋值问题
参考:https://www.cnblogs.com/zf-blog/p/10613981.html https://www.cnblogs.com/andywenzhi/p/7453374.html ...
- Android Loader使用时,屏幕解锁后,重复加载
在使用AsyncTaskLoader时,当手机解锁后,会重复加载数据,代码如下: static class CouponShopQueryLoader extends AsyncTaskLoader& ...
- CentOS6.5x64采用静默模式安装64位oracle11g
1.下载oracle11g64位版本的源文件,并上传到Linux服务器,下载地址自行百度,若实在找不到请留言. 2.Package安装检查安装: 通过yum工具直接安装: yum -y install ...
- 编写HTML和CSS几点心得
HTML代码优化 表单域用fieldset包起来,并用legend说明其用途(注意在css初始化的时候把fieldset的border设为0,把legend的display设为none) 每个inpu ...
- java ->IO流_File类
IO概述 回想之前写过的程序,数据都是在内存中,一旦程序运行结束,这些数据都没有了,等下次再想使用这些数据,可是已经没有了.那怎么办呢?能不能把运算完的数据都保存下来,下次程序启动的时候,再把这些数据 ...
- 小程序使用模板template
小程序使用模板template 1.介绍:模板就是代码的高度复用,将在很多页面使用了相同的部分可以使用模板封装 <!-- 在页面组件中使用 --> <!-- 此时定义了一个模板 -- ...
- SpringBoot + react app 项目,解决跨域问题的配置(跳坑含泪总结,亲测有效)
方法一: 对某一接口配置,可以在方法上添加 @CrossOrigin 注解 @CrossOrigin(origins = {"http://localhost:8110", &qu ...
- javascript----放大模式
放大模式 1.介绍:放大模式降低模块之间直接的联系,降低耦合,当一个模块出现错误,不会影响另一个模块的功能
- 00005-js 获取uuid
admin.guid = function () { function S4() { return (((1+Math.random())*0x10000)|0).toString(16).subst ...