我正在实施一个比较器,但它没有工作,所以我想我会写一个基本的冒泡排序。
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);
}
}
}
我真的很想掌握一些方法(比如弄清楚我的比较器为什么不起作用),但是现在我只想让一个冒泡排序工作正确。感谢。
答案 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.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,则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;
}
}