计数用Java排序

时间:2012-01-14 04:47:35

标签: java sorting

请帮助我实现Java中的Counting Sort的以下实现。我是Java和调试新手,所以我不确定错误。下面的代码的问题是,虽然它编译,我没有在屏幕上得到任何输出。请仔细阅读代码并向我推荐一些内容。也许存在一些逻辑错误。感谢

import java.io.*;
import java.lang.*;
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Cnt {
    public static void main(String[] args) throws java.lang.Exception {
        BufferedReader R = new BufferedReader(new InputStreamReader(System.in));
        int[] a ;
        int[] b;
        String inp = R.readLine();
        int N = Integer.parseInt(inp);
        a = new int[N];
        b = new int[N];
        for ( int i = 0; i< N; i++) {
            a[i] = Integer.parseInt(R.readLine());
        }
        int key = findmax(a);
         int k = key+1;
        int c[] = new int[k];
        for ( int i = 0; i < k; i++) {
            c[i] = 0;
        }
        for ( int j = 0; j < a.length; j++){
            c[a[j]] = c[a[j]] +1;
        }
        for ( int i = 1; i < key ; i++) {
            c[i] = c[i] + c[i-1];
        }
        for ( int j = (a.length - 1); j >=0; j--) {
            b[c[a[j]]] = a[j];
            c[a[j]]= c[a[j]] -1;
        }
        //System.out.println(b[0]);
        for ( int h = 0; h > b.length; h++) {
            System.out.println(b[h]);
        }

    }
    private static int findmax(int a[])
    {
        int r;
        r = a[0];
        for ( int i =0; i < a.length; i++ ) {
            if (a[i] >= r) {
                r = a[i];
            }
        }
        return r;
    }
}

2 个答案:

答案 0 :(得分:5)

  

我收到了一个ArrayOutofBoundsException。请仔细阅读代码并向我推荐一些内容。

这是错误的做法。你做的是:

  1. 查看异常的堆栈跟踪(您的IDE将向您显示)

  2. 查看代码中的行,其中堆栈跟踪表示引发了异常

  3. 阅读错误消息以找出索引值

  4. 通过阅读前面的代码

  5. 来弄清楚索引值是如何产生的
  6. 如果您无法从阅读代码中弄清楚,请使用IDE的调试器单步执行程序并观察变量/对象的值是什么以及它们如何更改


  7. 如果您发布了异常堆栈跟踪,我们可能会为您解决这个问题。事实上,如果有人准备花一些时间,他们可以可能在没有堆栈跟踪的情况下弄清楚

    但是,这会将此作为的学习练习而失败。你需要自己学习如何做这种事情......自己动手做。


    你问题的原始版本说:

      

    根据我的IDE,我得到一个ArrayOutofBoundsException

    我假设你的IDE告诉你你得到了一个异常,它显示异常消息,并且(如果你点击它或者什么)异常堆栈跟踪。当然,我的IDE能够做到这一点。

    如果不是这种情况,那么简单的替代方法就是在这个main的整个主体周围放置一个try / catch块。

    public static void main(String[] args) throws Exception {
        try {
            // existing main body
            ...
        } catch (Exception ex) {
            ex.printStackTrace();
            throw ex;  // or leave this out.
        }
    }
    

答案 1 :(得分:2)

好像你的问题就在这里:

for ( int h = 0; h > b.length; h++) {
        System.out.println(b[h]);
    }

你的for循环不起作用,因为条件总是假的,即h> b.length,改为:

for ( int h = 0; h < b.length; h++) {
        System.out.println(b[h]);
    }

希望这可能会有所帮助。

此致