簡體   English   中英

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

[英]Basic Bubble Sort with ArrayList in Java

我正在實施一個比較器,它沒有工作,所以我想我會寫一個基本的冒泡排序。

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); 
         }
     }
 }

我真的很想掌握一些方法(比如弄清楚我的比較器為什么不起作用),但是現在我只想讓冒號排序正常工作。 謝謝。

在冒泡排序中,您只需要比較相鄰元素並交換它們(取決於條件)。

如果您按升序執行比比較相鄰元素並交換if(arr[j]>arr[j+1]) 這將在最初的迭代中將最大的元素移動到結尾。因此在外部循環中有n-1次迭代來對數組進行排序,其中n是數組的長度。

閱讀第一個冒泡排序,因為您提到的教程是完全錯誤的

更正了代碼

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;
            }
   }
}

這是工作鏈接

這是一個奇怪且低效的實現,您可以比較彼此之間的每個數字。 像這樣的東西更直觀(可以稍微提高性能,但這不是重點,你只需節省大量時間而不會意外地使用索引犯錯誤,如果你真的關心性能而不是可讀性使用像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如果s僅包含符號,則為true

如果你寫,

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 字典順序小於字符串b ,則compareTo返回小於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]

感謝大家指點我正確的方向。 一個問題是我忘了.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);

             } 
        }
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.");
}

您最初使用的排序程序存在一個小問題。

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;
   }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM