今天看了一本书,书里有道题,题目很常见,排序,明了点说:

需求:输入:最多有n个正整数,每个数都小于n,

n为107 ,没有重复的整数

输出:按升序排列

思路:假设有一组集合 {1,3,5,6,11,12},我们可以用字符串来表示这组集合,0 1 0 1 0 1 1 0 0 0 0 1 1 代表集合中的数值的位为1,其他的都为0.

伪代码:

 //  将一个字符数组全部置为0,大小为给的数据中的最大值 
  for i = (0,n)   
       ch[i] = 0;   
  for each i in the int[]   
       ch[i] = 1;   
  for i = (0,n)   
         if ch[i] == 1 then   
            print();

实现代码:

   1:      public static void main(String[] args) {
   2:          long start = System.currentTimeMillis();
   3:          int max=100000001; //因为要在第100000000位上置1,所以max>100000000
   4:          int b_sort[]={12,1,5,4,8,11,10,22,33,44,11,100000000,3,4432,32425,423423,1241,41241,4234121,421414,124144,12341414,34,242};
   5:          //初始化Char[],全部置为0
   6:          char[] ch_sort = new char[max];
   7:          for(int i=0;i<max;i++){
   8:              char ch='0';
   9:              ch_sort[i]=ch;
  10:          }
  11:          //在相应的位置上置1
  12:          for (int i=0;i<b_sort.length;i++){
  13:              ch_sort[b_sort[i]]='1';
  14:          }
  15:          //输出Index,同时排序结束
  16:          for(int i=0;i<max;i++){
  17:              if (ch_sort[i] == '1'){
  18:                  System.out.println(i+"  ");
  19:              }
  20:          }
  21:          //运行时间    
  22:          long end = System.currentTimeMillis();
  23:          System.out.println("运行时间:" + (end - start) + "毫秒");
  24:      } 
       在满足一定的需求上,这种排序算法还是很高效,有效的,甚至不仅排序,去除重复项什么的也是不错的选择,算法算法,能捉老鼠的都是好猫。很多时候给你点提示解决问题就变的理所当然了,但却不能第一时间想到,这是需要提高的地方。
       续:昨晚就想把重复的也给排出来,早上发现这个和计数排序就是一个模样
   1:  public static void main(String[] args) {
   2:          long start = System.currentTimeMillis();
   3:          int max=100000001;
   4:          int b_sort[]={12,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,4,4,8,11,8,10,22,1,33,44,33,11,100000000,3,4432,32425,423423,1241,41241,4234121,421414,124144,12341414,34,242};
   5:          char[] ch_sort = new char[max];
   6:          for(int i=0;i<max;i++){
   7:              char ch='0';
   8:              ch_sort[i]=ch;
   9:          }
  10:   
  11:          for (int i=0;i<b_sort.length;i++){
  12:              ch_sort[b_sort[i]]+=1;
  13:          }
  14:   
  15:          for(int i=0;i<max;i++){
  16:              
  17:              if(ch_sort[i] != '0'){
  18:                  int a=0;
  19:                  a=(int)ch_sort[i]-48;
  20:                  for (int j=0;j<a;j++){
  21:                  System.out.print(i+"  ");
  22:                      }
  23:              }
  24:          }
  25:          
  26:          long end = System.currentTimeMillis();
  27:          System.out.println("运行时间:" + (end - start) + "毫秒");
  28:      }

      既然能置1,当然也能置2置3,但是如果重复项超出ascii码怎么办?

计数排序-java的更多相关文章

  1. 计数排序详解以及java实现

    前言 我们知道,通过比较两个数大小来进行排序的算法(比如插入排序,合并排序,以及上文提到的快速排序等)的时间复杂度至少是Θ(nlgn),这是因为比较排序对应的决策树的高度至少是Θ(nlgn),所以排序 ...

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

    计数排序   第10节 计数排序练习题 对于一个int数组,请编写一个计数排序算法,对数组元素排序. 给定一个int数组A及数组的大小n,请返回排序后的数组. 测试样例: [1,2,3,5,2,3], ...

  3. Java实现堆排序和计数排序

    堆排序代码: 思想:每次都取堆顶的元素,将其放在序列最后面,然后将剩余的元素重新调整为最小堆,依次类推,最终得到排序的序列. import java.util.Arrays; /** * 思路:首先要 ...

  4. 排序基础之非比较的计数排序、桶排序、基数排序(Java实现)

    转载请注明原文地址: http://www.cnblogs.com/ygj0930/p/6639353.html  比较和非比较排序 快速排序.归并排序.堆排序.冒泡排序等比较排序,每个数都必须和其他 ...

  5. 排序算法-计数排序(Java)

    package com.rao.sort; import java.util.Arrays; /** * @author Srao * @className CountSort * @date 201 ...

  6. Java排序之计数排序

    Java排序之计数排序 计数排序思路 计数排序适用于有明确范围的数组,比如给定一个数组,且知道所有值得范围是[m,n].这个时候可以使用一个n-m+1长度的数组,待排序的数组就可以散在这个数组上,数组 ...

  7. 计数排序和桶排序(Java实现)

    目录 比较和非比较的区别 计数排序 计数排序适用数据范围 过程分析 桶排序 网络流传桶排序算法勘误 桶排序适用数据范围 过程分析 比较和非比较的区别 常见的快速排序.归并排序.堆排序.冒泡排序等属于比 ...

  8. 桶排序和计数排序的理解实现和比较(Java)

    比较和非比较的区别 常见的快速排序.归并排序.堆排序.冒泡排序等属于比较排序.在排序的最终结果里,元素之间的次序依赖于它们之间的比较.每个数都必须和其他数进行比较,才能确定自己的位置.比较排序的优势是 ...

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

    计数排序 前提:待排序表中的所有待排序关键字必须互不相同: 思想:计数排序算法针对表中的每个记录,扫描待排序的表一趟,统计表中有多少个记录的关键码比该记录的关键码小,假设针对某一个记录,统计出的计数值 ...

随机推荐

  1. a byte of python(摘02)

    a byte of python 第四章 运算符与表达式 运算符 运算符优先级 (运算符通常由左向右结合,即具有相同优先级的运算符按照从左向右的顺序计算.例如, 2 + 3 + 4 被计算成 (2 + ...

  2. 安装PostgreSQL数据库 ,Database Cluster 失败!

    在安装PG数据库的过程中,会选择安装目录以及数据存放目录和端口,并需要选择Local,如果全部使用默认,并且设置好自己的密码后开始安装,前期进展还比较顺利,到了安装Database Cluster时, ...

  3. OKhttp的封装(下)

    OKhttpManager2.Class  请求工具类 package com.example.administrator.okhttp3; import android.os.Handler; im ...

  4. 在JAVA中如何跳出当前的多重嵌套循环

    可以使用return,但使用return后,会跳出整个函数,多重循环后面的代码无法执行. public static void main(String[] args) { // TODO Auto-g ...

  5. NIS 报错No such map passwd.byname. Reason: Can't bind to server which serves this domain

    在NIS—client端使用命令:ypcat passwd ,把错如上题, 原因:client端ypbind服务未启动解决方法:当然是启动ypbind了,命令:service ypbind start ...

  6. iOS开发MAC下配置svn

    版本控制对于团队合作显得尤为重要,那么如何在iOS开发中进行版本控制呢?在今天的博客中将会介绍如何在MAC下配置SVN服务器,如何导入我们的工程,如何在Xcode中进行工程的checkOut和Comm ...

  7. ios 上下拉刷新

    UITableView:下拉刷新和上拉加载更多 - cDigger 时间 2013-11-24 02:00:00  博客园精华区 原文  http://www.cnblogs.com/lexingyu ...

  8. 检查Android系统版本

    <script type="text/javascript"> $(function(){ var userAgent = navigator.userAgent; v ...

  9. 《Thinking in Java》十七章_容器深入研究_练习13(Page484)

    练习13: 单词计数器 import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileNotFou ...

  10. 关于安装Ubuntu后触摸板无法使用的解决方案

    安装了Ubuntu后发现触摸板无法使用,以为是修改了安装文件导致(之前拿安装源文件做了小实验),于是重装,之后触摸板仍无法使用,在一个长满小广告的页面上找到了解决方案. 以下是原文章内容: 最近突然发 ...