[英]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.length
或4 < 5
為true
,但是您將獲得訪問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.