在java中输入vector时如何排序数字

时间:2016-11-13 15:37:55

标签: java arrays algorithm sorting vector

我想在输入矢量之前以排序方式添加数字。但结果不对,我很困惑问题出在哪里? 输出如下所示。

我想在没有任何内置方法的情况下使用某种算法进行排序。

import java.util.Vector;

public class Test {
    public static void main(String ar[]){
    //Numbers to enter in vector
    int[] number = {5,2,98,3,10,1};

    Vector<Integer> v = new Vector<Integer>();

    v.add(number[0]);
    for(int i=1;i<number.length;i++){
            for(int j=v.size();j>0;j--){
                System.out.println("Entered: "+number[i]);
                if(number[i] <= v.get(j-1)){
                    v.add(j-1,number[i]);
                    break;
                }else{
                    v.add(j,number[i]);
                    break;
                }
            }
        }
    for(int s:v)
        System.out.print(s + " ");
  }
}

输出:

输入:2

输入:98

输入:3

输入:10

输入:1

2 5 3 10 1 98

4 个答案:

答案 0 :(得分:1)

你有一个基于变量for的第二个(内部)j循环,但那个&#34;循环&#34;只会执行一次。 j循环中的条件导致循环退出(break;)。

当您添加每个号码时,唯一的可能性是上一个或下一个。

答案 1 :(得分:0)

你的内部for循环实际上并没有循环。 无论条件number[i] <= v.get(j-1)如何, 循环将在一步后退出。

你想做的是, 从向量的开头迭代, 当你发现一个比你要插入的元素大的元素时, 然后插入它,并打破循环。 这与你到目前为止所做的相反,它是从向量的末尾开始迭代的。 如果在没有插入任何东西的情况下到达循环的末尾, 然后追加价值。

该计划也非常需要其他一些改进:

  • 如果您不需要向量是线程安全的,那么您就不需要Vector。请改用ArrayList
  • 第一个号码的特殊处理是不必要的。
  • 可以使用for-each惯用语以更自然的方式编写外部循环。
  • 无需循环打印元素,toString Vector实现已经很容易阅读。
  • 变量名称非常差,可以轻松改进。
  • 缩进不一致,使代码难以阅读。

修复问题并提出建议:

List<Integer> list = new ArrayList<>();

for (int current : numbers) {
  boolean inserted = false;
  for (int j = 0; j < list.size(); j++) {
    if (current <= list.get(j)) {
      list.add(j, current);
      inserted = true;
      break;
    }
  }
  if (!inserted) {
    list.add(current);
  }
}
System.out.println(list);

最后但并非最不重要的是,不是通过迭代列表来搜索插入点, 使用二进制搜索可以获得更好的性能, 特别是对于更大的价值观。

答案 2 :(得分:0)

你的内循环似乎不会循环多次。这就是为什么钥匙没有插入正确位置的原因。

更简洁的解决方案是

public class Test {
    public static void main(String ar[]){
    //Numbers to enter in vector
    int[] number = {5,2,98,3,10,1};

    Vector<Integer> v = new Vector<Integer>();
    v.setSize(number.length);
    v[0] = number[0];

    for(int i=1, vSize = 1; i < number.length; i++, vSize++){
          int j = 0, k = 0; 
          for(j = 0; j < vSize; j++) {
               if(v[j] < number[i]) {
                  break;
           }
           for(k = vSize; k > j; k--) {
               v[k] = v[k -1];
           }
           v[k] = number[i];
    }
    for(int s:v)
        System.out.print(s + " ");
  }
}

答案 3 :(得分:0)

另一个简单的解决方案是:

U+270A U+1F3FE

内部import java.util.Vector; public class Test { public static void main(String ar[]){ //Numbers to enter in vector int[] number = {5,2,98,3,10,1}; Vector<Integer> v = new Vector<Integer>(); v.add(number[0]); for(int i=1, j;i<number.length;i++){ //j declared here for better scope for(j=v.size();j>0 && v.get(j-1)>number[i] ;j--); //<-- some changes here, v.add(j,number[i]); //<-- and here } } for(int s:v) System.out.print(s + " "); } } 循环仅用于查找要插入的元素的正确索引。