使用Java中的ArrayList进行基本冒泡排序

时间:2015-06-20 08:32:17

标签: java sorting arraylist

我正在实施一个比较器,但它没有工作,所以我想我会写一个基本的冒泡排序。

int[] numbers = { 5, 8, 14, 1, 5678 };
int tempVar;
for (int i = 0; i < numbers.length; i++)
{
   for(int j = 0; j < numbers.length; j++)
   {
            if(numbers[i] > numbers[j + 1])
            {
                   tempVar = numbers [j + 1];
                   numbers [j + 1]= numbers [i];
                   numbers [i] = tempVar;
            }
   }
}
for (int i = 0; i < numbers.length; i++)
{
     System.out.println(numbers[i].toString());
}

本教程是否正确? https://blog.udemy.com/bubble-sort-java/

我按照这个例子将它应用到了一个arraylist中的Last Names,但结果有些怪异。

String a;
String b;
Person c;
Person d;

for (int i=0; i< list.size(); i++){

    for(int j=0; j< list.size()-1; j++){

         a = list.get(i).getLastName();
         b = list.get(j+1).getLastName();
         c = list.get(i);
         d = list.get(j+1);

         if ( a.compareTo(b) < 0 )  {

             Person temp = d;
             list.set(j+1, c);        
             list.set(i, temp); 
         }
     }
 }

我真的很想掌握一些方法(比如弄清楚我的比较器为什么不起作用),但是现在我只想让一个冒泡排序工作正确。感谢。

6 个答案:

答案 0 :(得分:2)

在冒泡排序中,您需要仅比较相邻元素并交换它们(取决于条件)。

如果您按升序排序而不是比较相邻元素并交换if(arr[j]>arr[j+1])。 这会在最初的迭代中将最大的元素移动到结尾。因此在外部循环中有n-1个迭代来对数组进行排序,其中n是数组的长度。

首先阅读此Bubble sort,因为您提到的教程是完全错误的

更正后的代码

for (int i = 0; i < numbers.length-1; i++)
{
   for(int j = 0; j < numbers.length-i-1; j++)
   {
            if(numbers[j] > numbers[j + 1])
            {
                   tempVar = numbers [j + 1];
                   numbers [j + 1]= numbers [j];
                   numbers [j] = tempVar;
            }
   }
}

以下是working link

答案 1 :(得分:1)

这是一个奇怪而低效的实现,你比较彼此的每个数字。像这样的东西更直观(可以稍微提高性能,但这不是重点,你只需节省大量时间而不会意外地使用索引犯错误,如果你真的关心性能而不是可读性使用像Java那样进行mergesort或quicksort [Java正在使用基本类型的快速排序和对象的mergesort,可能因为对于原始类型,如果算法是否稳定则无关紧要]):

public void bubbleSort(int[] arr) {
    boolean change;
    do {
        change = false;
        for (int i = 0; i < arr.length - 1; i++) {
             if (arr[i] > arr[i + 1]) {
                 int temp = arr[i];
                 arr[i] = arr[i + 1];
                 arr[i + 1] = temp;
                 change = true;
             }
        }
    } while (change);
}

应用于您的代码(升序排序):

boolean change;
do {
    change = false;
    for (int i = 0; i < list.size() - 1; i++) {
         c = list.get(i);
         d = list.get(i + 1);
         a = c.getLastName();
         b = d.getLastName();
         // add special comparison for null values if a or b can be null ("" is ok)
         // toLowerCase() is to compare case-insensitive ('a' != 'A')
         if (a.toLowerCase().compareTo(b.toLowerCase()) > 0) {
             list.set(i, d);        
             list.set(i + 1, c);
             change = true;
         }
     }
} while (change);

旁注:s.toUpperCase().compareTo(s.toLowerCase()) == 0如果true仅包含符号,则为s

答案 2 :(得分:1)

如果你写,

for(int j = 0; j < numbers.length; j++)

然后,您将获得以下行的ArrayIndexOutOfBoundsException

tempVar = numbers [j + 1];

因为,数组numbers的长度为5,最后一个索引为4(索引从0开始)。因此,当j = 4时,循环中断条件j < numbers.length4 < 5true,但您将获得访问numbers [4 + 1]索引的异常。

所以试试

for(int j = 0; j < numbers.length -1; j++)

for(int j = i; j < numbers.length -1; j++) // more efficient

现在,对于代码的第二个片段,您能告诉我您的问题究竟是什么?

狂野猜测,您的a.compareTo(b) < 0无法正常工作。

请注意,如果字符串a比字符串bcompareTo,则lexicographically会返回小于0的值。

我很困惑你究竟想要什么,因此产生以下代码可以帮助你克服你的问题:

import java.util.ArrayList;

public class Sort{
    private static ArrayList<String> list = new ArrayList<String>();

    public static ArrayList<String> sortByName(String [] input) {
        String temp;
        for (int i=0; i< input.length; i++){
            for(int j= i; j< input.length-1; j++){
                char first = input[i].charAt(0);
                char sec = input[j +1].charAt(0);
                 if (first < sec)  {
                     temp = input[j +1];
                     input[j +1] = input[i];        
                     input[i] = temp;
                 }
             }
            list.add(input[i]);
         }

        return list;
    }

    public static void main(String[] args) {
        String string[] =  {"Ezen", "Allen" , "Wilker", "Kruden", "Crocket"};
        bubbleSortByName(string);
    }
}

输出为list,其中包含:

  

list = [Wilker,Kruden,Ezen,Crocket,Allen]

答案 3 :(得分:1)

感谢大家指点我正确的方向。 一个问题是我忘了.trim()所以compareTo没有工作,也没有与charAt(0)比较。

另外,我发现了一个更好的Bubble-Sort循环实现。

这就是现在的工作:

    String a;
    String b;
    Person c;
    Person d;

    for (int i= 0; i< list.size() ; i++){

        for(int j=0; j< list.size() - i-1; j++){

             a = list.get(j).getLastName().toUpperCase().trim();
             b = list.get(j+1).getLastName().toUpperCase().trim();

             c = list.get(j);
             d = list.get(j+1);

             if ( a.compareTo(b) > 0)  {

                 Person temp = d;  
                 list.set(j+1, c);
                 list.set(j, temp);

             } 
        }

答案 4 :(得分:1)

Bubble Sort Swap Printer in JAVA:
static void countSwaps(int[] a) {
    int swaps = 0;
    for(int i=0; i<a.length-1; i++){
        for(int j=0; j<a.length-i-1; j++){
            if (a[j] > a[j+1]){
                int temp = a[j];
                a[j] = a[j+1];
                a[j+1] = temp;
                swaps++;
            }
        }
    }
    System.out.println("Array is sorted in " + swaps +" swaps.");
}

答案 5 :(得分:0)

您最初使用的排序程序存在一个小问题。

int j=0

应该是

int j=i

此外,您还没有完全替换字符串排序。

a.compareTo(b) < 0

应该是

a.compareTo(b) > 0

检查一下:

import java.util.*;

public class HelloWorld{
public static void main(String[] args){

   ArrayList<Person> list = new ArrayList<Person>();
   list.add(new Person("xyz"));
   list.add(new Person("abc"));
   list.add(new Person("pqr"));
   list.add(new Person("lmn"));

   String a;
   String b;
   Person c;
   Person d;
   for (int i=0; i< list.size(); i++){
      for(int j=i; j< list.size()-1; j++){
         a = list.get(i).getLastName();
         b = list.get(j+1).getLastName();
         c = list.get(i);
         d = list.get(j+1);

         if ( a.compareTo(b) > 0 )  {

             Person temp = d;
             list.set(j+1, c);        
             list.set(i, temp); 
        }
     }
  }
  for(Person person: list){
      System.out.println(person.lastName);
  }
}
}
class Person{

   String lastName;
   Person(String str){
      lastName = str;
   }
   public String getLastName(){
      return lastName;
   }
}