我在大学里得到了这个bubort,我正试图运行它!它应该按照大小,从最小到最大的顺序对数字进行排序。任何帮助,将不胜感激。 (它来自YouTube上的Derek Banas)。你知道为什么它不起作用吗?
public class ListForSorting {
int arraySize = 10;
int[] myArray = { 10, 12, 3, 4, 50, 60, 7, 81, 9, 100 };
public void printArray() {
System.out.println("----------");
for (int i = 0; i < arraySize; i++) {
System.out.print("| " + i + " | ");
System.out.println(myArray[i] + " |");
System.out.println("----------");
}
}
public static void main(String[] args) {
ListForSorting list = new ListForSorting();
list.printArray();
list.bubbleSort();
list.printArray();
}
public void bubbleSort() {
for (int i = arraySize - 1; i > 1; i--) {
for (int j = 0; j < i; j++) {
if (myArray[j] < myArray[j + 1])
swap(j, j + 1);
}
}
}
public void swap(int indexOne, int indexTwo) {
int temp = myArray[indexOne];
myArray[indexOne] = myArray[indexTwo];
temp = myArray[indexTwo];
}
}
输出:
----------
| 0 | 10 |
----------
| 1 | 12 |
----------
| 2 | 3 |
----------
| 3 | 4 |
----------
| 4 | 50 |
----------
| 5 | 60 |
----------
| 6 | 7 |
----------
| 7 | 81 |
----------
| 8 | 9 |
----------
| 9 | 100 |
----------
----------
| 0 | 81 |
----------
| 1 | 100 |
----------
| 2 | 100 |
----------
| 3 | 100 |
----------
| 4 | 100 |
----------
| 5 | 100 |
----------
| 6 | 100 |
----------
| 7 | 100 |
----------
| 8 | 100 |
----------
| 9 | 100 |
谢谢!
答案 0 :(得分:3)
您的swap
功能错误。它应该是这样的:
public void swap(int indexOne, int indexTwo) {
int temp = myArray[indexOne];
myArray[indexOne] = myArray[indexTwo];
myArray[indexTwo] = temp;
}
此外,bubblesort
函数有错误。计数器i
应该降至1
而不是2
,否则您的第一个元素将不会按原样排序:
public void bubbleSort() {
for (int i = arraySize - 1; i > 0; i--) {
for (int j = 0; j < i; j++) {
if (myArray[j] < myArray[j + 1])
swap(j, j + 1);
}
}
}
现在输出:
----------
| 0 | 10 |
----------
| 1 | 12 |
----------
| 2 | 3 |
----------
| 3 | 4 |
----------
| 4 | 50 |
----------
| 5 | 60 |
----------
| 6 | 7 |
----------
| 7 | 81 |
----------
| 8 | 9 |
----------
| 9 | 100 |
----------
----------
| 0 | 100 |
----------
| 1 | 81 |
----------
| 2 | 60 |
----------
| 3 | 50 |
----------
| 4 | 12 |
----------
| 5 | 10 |
----------
| 6 | 9 |
----------
| 7 | 7 |
----------
| 8 | 4 |
----------
| 9 | 3 |
----------
如果您想要从最小的数字到最大的数字,只需在if
函数中更改bubblesort
条件:
public void bubbleSort() {
for (int i = arraySize - 1; i > 0; i--) {
for (int j = 0; j < i; j++) {
if (myArray[j] > myArray[j + 1])
swap(j, j + 1);
}
}
}
现在,输出将是:
----------
| 0 | 10 |
----------
| 1 | 12 |
----------
| 2 | 3 |
----------
| 3 | 4 |
----------
| 4 | 50 |
----------
| 5 | 60 |
----------
| 6 | 7 |
----------
| 7 | 81 |
----------
| 8 | 9 |
----------
| 9 | 100 |
----------
----------
| 0 | 3 |
----------
| 1 | 4 |
----------
| 2 | 7 |
----------
| 3 | 9 |
----------
| 4 | 10 |
----------
| 5 | 12 |
----------
| 6 | 50 |
----------
| 7 | 60 |
----------
| 8 | 81 |
----------
| 9 | 100 |
----------
编辑:效果
你可以通过“检查”内部循环是否至少进行一次交换来加快速度。如果不是这意味着你可以存在外部循环,因为它完成了,并为其余的外循环迭代节省了时间。
答案 1 :(得分:1)
您的代码中遇到的问题最多的是:
您正在循环整个事件N-1
次
这是不必要的过多循环,直到数组被排序。所以直到内循环没有发生交换。
我将这样的升序冒号排序(在 C ++ 中):
void sort_asc(int *a,int n)
{
int i,e;
for (e=1;e;n--) // loop until no swap occurs
for (e=0,i=1;i<n;i++) // process array
if (a[i-1]>a[i]) // if swap needed
{
e=a[i-1]; // swap
a[i-1]=a[i];
a[i]=e;
e=1; // allow to process array again
}
}
用法:
int a[]={ 9,8,7,6,5,4,3,2,1,0 }; // worse case scenario
sort_asc(a,sizeof(a)/sizeof(a[0]));
降序只是将条件改为:
if (a[i-1]<a[i]) // if swap needed
顺便说一下,这里有一些排序32位int a[1024]
数组的测量循环100次:
Time Space
[ 1.428 ms] Worse case O(n)
[ 312.744 ms] Bubble asc O(n^2) O(1 ) OK
[ 306.084 ms] Bubble dsc O(n^2) O(1 ) OK
[ 9.883 ms] Quick asc O(n.log(n)) O(log(n)) OK
[ 10.620 ms] Quick dsc O(n.log(n)) O(log(n)) OK
[ 1.816 ms] Random O(n)
[ 374.343 ms] Bubble asc O(n^2) O(1 ) OK
[ 361.219 ms] Bubble dsc O(n^2) O(1 ) OK
[ 14.402 ms] Quick asc O(n.log(n)) O(log(n)) OK
[ 14.519 ms] Quick dsc O(n.log(n)) O(log(n)) OK
asc和desc排序具有相同的速度,轻微的测量差异仅仅是由于 CACHE ,因为它们都使用相同的内存空间,因此在测试中首先调用一个将更慢,第二个好处从内存映射到 CACHE 的事实(如果不是太粗糙)。顺便说一句,这段代码可以进一步优化......