Java 返回不希望的结果的BubbleSort算法

Java 返回不希望的结果的BubbleSort算法,java,bubble-sort,Java,Bubble Sort,下面是我对冒泡排序算法的实现 import java.util.Arrays; public class BubbleSort { public static void main(String[] args) { int[] unsorted = {1,3,5,6,2}; System.out.println(Arrays.toString(unsorted)); bubbleSort(unsorted); Syste

下面是我对冒泡排序算法的实现

 import java.util.Arrays;

 public class BubbleSort {
    public static void main(String[] args) {
        int[] unsorted = {1,3,5,6,2};
        System.out.println(Arrays.toString(unsorted));
        bubbleSort(unsorted);
        System.out.println(Arrays.toString(unsorted));
    }

    public static void bubbleSort(int[] unsorted){
        int i;
        int j;
        int temp;
        for (i = 0; i < unsorted.length; i++) {
            for (j = 1; j < unsorted.length-1; j++) {
                if (unsorted[i] > unsorted[j]) {
                    temp = unsorted[i];
                    unsorted[i] = unsorted[j];
                   unsorted[j] = temp;
                 }
             }
        }
   }
 }

这显然是错误的,但我的逻辑似乎是正确的

您的两个问题都与这一行有关:

for (j = 1; j < unsorted.length-1; j++) {
for(j=1;j
您不希望从第一个元素循环,而是希望从i之后的第一个元素循环:

for (j = i+1; j < unsorted.length-1; j++) {
for(j=i+1;j
您还需要一路走到底:

for (j = i+1; j < unsorted.length; j++) {
for(j=i+1;j
这是正确的代码
>导入java.util.array;
公共类泡泡糖{
公共静态void main(字符串[]args){
int[]未排序={1,3,5,6,2};
System.out.println(Arrays.toString(未排序));
气泡排序(未排序);
System.out.println(Arrays.toString(未排序));
}
公共静态void bubbleSort(int[]未排序){
int i;
int j;
内部温度;
对于(i=0;i未排序的[j]){
温度=未排序的[i];
未排序的[i]=未排序的[j];
未分类[j]=温度;
}
}
}
}
}
第二个循环在i之后开始,因此j始终从i+1开始,以unsorted.length结束,而我以unsorted.length-1结束

我已将气泡排序算法保存在我的计算机中,这是(不复制到新数组):

publicstaticvoidbubblesort(int[]v){
对于(int i=0;ii;j--)
如果(v[j-1]>v[j]){
int aux=v[j-1];
v[j-1]=v[j];
v[j]=aux;
}
}
一些事情 1) 可以在循环范围内声明i和j 2) 尝试保持迭代0->length的一致性 3) 小于等于i
public static void bubbleSort(int[] unsorted) {
    for (int i = 0; i < unsorted.length; i++) {
        for (int j = 0; j < unsorted.length; j++) {
            if (unsorted[i] < unsorted[j]) {
                int temp = unsorted[i];
                unsorted[i] = unsorted[j];
                unsorted[j] = temp;
            }
        }
    }
}
publicstaticvoidbubblesort(int[]未排序){
for(int i=0;i
您的第二个循环应该开始
for(j=i+1;…
这样做会输出相同的未排序数组[1,3,5,6,2][1,3,5,6,2]去掉同一行上的-1第二个循环中的停止条件应该从:
j
改为:
j
好了……现在我需要理解为什么这样做了。你能帮我理解为什么从j=1开始循环不同于j=i+1吗?因为j=1意味着它从第二个v开始循环数组的值,这也应该是很好的。在外循环的第一次迭代中,它们是相同的-所以你说对了一半!但是,在外循环的后续迭代中,在你的例子中,J总是等于1。在我的例子中,第一个J等于1,然后是2,然后是3,依此类推。@user3059625所以如果你说
J=1
,而不是
J=i+1
,您的意思是,即使在
i=3
时,
j=1
而不是
j=4
。由于您正在进行嵌套for循环,可能很容易混淆,但您正在通过内部for循环进行迭代,然后增加
i
。第一次通过时,您可以确保a的第一个值只要您的逻辑正确,rray是最低的,因此我会递增,您无需担心。您可以担心下一个值。谢谢Michael和Orin,我现在清楚地看到了差异。:)虽然这是正确的,但试着更深入地解释一下为什么会这样。仅仅给出答案无助于OP学习任何东西,如果他没有学习任何东西,他总是会来寻找答案。:)好的,这个算法取表中的第一个元素(i),从下一个元素开始移动(j),寻找一个大于第一个的数字。这就是为什么我一直到unsorted.length-1,因为如果你到达表的末尾,j将不再在表中。我移动到第二个元素,因为在第一个循环之后,第一个elelent已经在它的位置,所以不再需要在它上面,等等
here is the correct code

> import java.util.Arrays;

 public class BubbleSort {
    public static void main(String[] args) {
        int[] unsorted = {1,3,5,6,2};
        System.out.println(Arrays.toString(unsorted));
        bubbleSort(unsorted);
        System.out.println(Arrays.toString(unsorted));
    }

    public static void bubbleSort(int[] unsorted){
        int i;
        int j;
        int temp;
        for (i = 0; i < unsorted.length-1; i++) {
            for (j = i+1; j < unsorted.length; j++) {
                if (unsorted[i] > unsorted[j]) {
                    temp = unsorted[i];
                    unsorted[i] = unsorted[j];
                   unsorted[j] = temp;
                 }
             }
        }
   }
 }

the second loop begins after i so j alway start at i+1 and end at unsorted.length while i end at unsorted.length-1
public static void bubbleSort (int[] v) {
      for (int i=0; i<v.length-1; i++)
         for (int j=v.length-1; j>i; j--)
            if (v[j-1]>v[j]) {
               int aux = v[j-1];
               v[j-1] = v[j];
               v[j] = aux;   
            }
   }
public static void bubbleSort(int[] unsorted) {
    for (int i = 0; i < unsorted.length; i++) {
        for (int j = 0; j < unsorted.length; j++) {
            if (unsorted[i] < unsorted[j]) {
                int temp = unsorted[i];
                unsorted[i] = unsorted[j];
                unsorted[j] = temp;
            }
        }
    }
}