2015-12-24 3 views
1

Я создаю программу, которая может сортировать объекты (вектор) с помощью метода сортировки Bubble. Я нашел код в Интернете, который помог мне много, чтобы создать его (Bubble сортировки в массивах): http://www.programmingsimplified.com/java/source-code/java-program-to-bubble-sortBubble сортировать в векторе в Java

Когда я скомпилировать программу я не получаю синтаксическую ошибку, но результаты не являются правильными. Я думаю, что я сделал ошибку в IF-Statement, но я не уверен, что это единственная ошибка. Вот результат я получаю, когда я запустить его:

Input number of integers to sort 
5 
Enter 5 integers 
2 
0 
1 
6 
4 
Sorted list of numbers 
1 
2 
3 
3 
3 

И вот мой код:

import java.util.Scanner; 
import java.util.*; 
import java.io.*; 
class BubbleSortVector { 
    public static void main(String []args) { 
    int n, c, d, swap; 
    Scanner in = new Scanner(System.in); 

    System.out.println("Input number of integers to sort"); 
    n = in.nextInt(); 

    Vector v ; 
    v = new Vector(); 

    System.out.println("Enter " + n + " integers"); 

    for (c = 0; c < n; c++) 
     //v.addElement(c); 
    v.insertElementAt(in.nextInt(),c); 


    for (c = 0; c < (n - 1); c++) { 
     for (d = 0; d < n - c - 1; d++) { 
     if ((Integer)v.elementAt(d) > (Integer)v.elementAt(d+1)) /* For descending order use < */ 

     { 
      swap = (Integer)v.elementAt(d); 
      v.insertElementAt(d+1,d); 
      v.insertElementAt(swap,d+1); 

     } 
     } 
    } 

    System.out.println("Sorted list of numbers"); 

    for (c = 0; c < n; c++) 
     System.out.println(v.elementAt(c)); 
    } 
} 
+1

Любая конкретная причина, по которой вы используете вектор? Не то чтобы в этом случае важно, просто любопытно. В 99.9996 (я считаю, что это точный номер) случаев, когда вы не хотите, чтобы в большинстве случаев «Вектор» вам нужна реализация «List», в этом случае я рекомендую «ArrayList». Опять же, не связано с ошибкой. – Emz

+0

@ Emz Это для моего устного экзамена, я должен сделать один с массивами, а другой с векторами. И сделайте мини-презентацию этого :) – TinaXx

+0

У вас есть доступ к правильной среде IDE, которая позволяет устанавливать точки останова для отладки? – Coderchu

ответ

3
// ... 
    Vector<Integer> v = new Vector<>(); 
    // ... 
    for (c = 0; c < (n - 1); c++) { 
     for (d = 0; d < n - c - 1; d++) { 
      if (v.get(d) > v.get(d + 1)) { 
       swap = v.get(d); 
       v.set(d, v.get(d + 1)); 
       v.set(d + 1, swap); 
      } 
     } 
    } 
    // ... 
+0

Спасибо, сработало! Мне просто нужно было преобразовать объекты в Integer: if ((Integer) v.get (d)> (Integer) v.get (d + 1)) {AND swap = (Integer) v.get (d); – TinaXx

+1

@ petie12 Тогда вы * все еще * используете ** необработанные типы **. *** Пожалуйста, не делайте этого **. –

+0

@ petie12, пожалуйста, не бросайте их как Integer, а следуйте за ответом Эллиотта и расскажите, какие объекты хранятся в магазинах 'Vector v'. – Emz

0

Ваш следующий код неправильно, вставив d+1 по индексу d означает, что вы используете значение из индекс цикла/счетчик в вектор, а не фактическое значение, которое при d+1

swap = (Integer)v.elementAt(d); 
v.insertElementAt(d+1,d); // this is incorrect, d is the index/loop counter 
v.insertElementAt(swap,d+1); 

Chage, что средняя линия:

v.insertElement((Integer)v.elementAt(d+1), d); 
+0

Я изменил его, но когда я вводил те же цифры, что и предыдущий, я получаю 0 0 2 2 0 вместо 0 1 2 4 6 – TinaXx

0

можно решить простым методом свопинга. после цикла вы печатаете массив.

 int[] Array = new int[5]{2 , 0 , 6 , 1 , 4}; 

     int temp = 0; 
     for (int i = 0; i < Array.Length; i++) 
     { 
      for (int j = 0; j < Array.Length - 1; j++) 
      { 
       if (Array[j] > Array[j + 1]) 
       { 
        temp = Array[j + 1]; 
        Array[j + 1] = Array[j]; 
        Array[j] = temp; 
       } 
      }    
     } 
Смежные вопросы