【问题标题】:bubblesort alg using an array使用数组的冒泡排序算法
【发布时间】:2013-09-09 16:08:17
【问题描述】:

好的,我今天已经为此工作了一段时间,我知道它非常接近完成。我一直在试图找到一个能够最终返回列表的转义子句。这是我处理过的所有代码。

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package algorithm;

import java.util.Arrays;
import java.util.Collections;

/**
 *
 * 
 */
public class Algorithm {

    /**
     * @param args the command line arguments
     */
    private static int list[] = {10, 9, 8, 7, 6};

    public static void main(String[] args) {
        Algorithm alg = new Algorithm();
        alg.bubblesort(list);
    }

    public Algorithm() {
    }

    public int[] bubblesort(int[] i) {
        for (int a = 0; a < i.length;) {
            for (int b = 1; b < i.length + 1;) {
                int currentNumber = i[a];
                if (b < i.length) {
                    if (currentNumber > i[b]) {
                        i[a] = i[b];
                        i[b] = currentNumber;
                        a++;
                        b++;
                    } else if (currentNumber < i[b]) {
                        a++;
                        b++;
                    }
                } else if (b == i.length) {
                    a = 0;
                    b = 1;
                }
            }
        }
        return i;
    }

    public void isSorted(int[] i) {
        for (int x = 0; x < i.length;) {
            if (i[x + 1] < i[i.length - 1]) {
                if (i[x] < i[x + 1]) {
                    x++;
                }
            }
        }

        System.out.println(Arrays.toString(i));
    } 
}

好的,我的问题是如何才能返回最终的排序列表?

【问题讨论】:

  • @StephenD 只要努力表现出功课,他就没有错。
  • 你的问题是......
  • 这看起来不像冒泡排序;冒泡排序应该只比较和交换彼此相邻的项目。你能用文字解释一下你的算法吗?
  • 哦该死我的问题没有显示:哦,我的错
  • @Joni 我正在比较列表中彼此相邻的项目。如果 (currentNumber > i[b]) { i[a] = i[b]; i[b] = 当前编号;一个++; b++;

标签: java arrays int bubble-sort


【解决方案1】:

这是一个用 Java 实现的冒泡排序......

public class BubbleSort {

static int intArray[] = { 10, 5, 100, 1, 10000 };

public static void doSort() {
    for (int outer = 0; outer < intArray.length; outer++) {
        for (int inner = 0; inner < intArray.length - outer- 1; inner++) {
            if (intArray[inner] > intArray[inner + 1]) {
                int temp = intArray[inner];
                intArray[inner] = intArray[inner + 1];
                intArray[inner + 1] = temp;
            }
        }
    }
}

public static void printArray() {
    for (int i = 0; i < intArray.length; i++) {
        System.out.print("  " + intArray[i]);
    }
}

public static void main(String args[]) {
    System.out.print("Array Before Sorting->");
    printArray();
    doSort();
    System.out.print("\nArray After Sorting ->");
    printArray();
}

}

对于上述程序和冒泡排序的详细解释,请查看链接-http://www.javabrahman.com/algorithms-in-java/bubble-sort-in-java/

【讨论】:

    【解决方案2】:

    进行冒泡排序最简单的方法是使用while 循环,这样您就不必嵌入for 循环。

    试试这个:

    public int[] bubblesort(int[] i) {
        int temp;
        int a = 0;
    
        while(a < (i.length - 1)) {
            if(i[a+1] < i[a]) {
                //Swap i[a] with i[a+1]
                temp = i[a];
                i[a] = i[a+1];
                i[a+1] = temp;
                //Reset counter
                a = 0;
            } else {
                //Increment counter if two elements are already in order
                a++;
            }
        }
    
        return i;
    }
    

    编辑:为你的尝试添加这个:

    if(a == (i.length-1) {
        break;
    }
    

    一旦你的外循环结束(意味着它应该被排序),这应该会打破循环。代码如下所示:

    public int[] bubblesort(int[] i) {
        for (int a = 0; a < i.length;) {
            for (int b = 1; b < i.length + 1;) {
                int currentNumber = i[a];
                if (b < i.length) {
                    if (currentNumber > i[b]) {
                        i[a] = i[b];
                        i[b] = currentNumber;
                        a++;
                        b++;
                    } else if (currentNumber < i[b]) {
                        a++;
                        b++;
                    }
                } else if (b == i.length) {
                    a = 0;
                    b = 1;
                }
            }
            //Break out of loop when it gets to the end
            if(a == (i.length - 1)) {
                break;
            }
        }
        return i;
    }
    

    【讨论】:

    • 这是一种简洁的方式。尽管就我而言,我似乎找不到返回列表的方法,但即使列表已经排序,我也会一遍又一遍地重复 for 循环。你能想出一种方法来尝试在我的情况下启用它,而不必调整我对你所做的大部分工作,否则这意味着我没有为我的练习编写算法的核心,哈哈。如果你明白我的意思。
    • 不幸的是,这不起作用。我的冒泡排序变得如此复杂的一个原因是它只做了一个阶段。因此,例如,如果我有数字 5、4、3、2、1 并且我执行常见的冒泡排序,它会将 5 浮动到顶部,列表为 4、3、2、1、5,它会停在那里。感谢您的尝试:)。如果您确实找到了其他解决方案,请随时发布。
    【解决方案3】:

    首先,您应该决定是(1)直接更改list还是(2)不。

    alg.bubblesort(list);
    

    我认为这句话的意思是(1),因为你没有抓住结果。如果你想做(2),它应该是

    int[] result = alg.bubblesort(list);
    

    并且,如果 (1) 更好,则修复 bubblesort 的定义

    public void bubblesort (int[] args)
    

    另外,你不应该使用int[] i,因为变量i通常表示数组的索引。

    【讨论】:

    • 哦,我的回答没有任何意义。我现在修好了。
    • 我想做 1. 我已经改变了我将参数命名为您建议的非常规方式,尽管我仍然不确定如何直接更改列表。我一直在尝试创建一个条件,使其能够停止循环遍历 for 循环,并想出了使用另一种方法 isSorted 的想法,即在bubblesort方法中调用它,该方法将检查每个索引的每个值是否较小比下一个,如果都是然后返回列表。上面的代码中没有这样显示,因为我后来放弃了它并做了其他事情,现在没有链接
    • 你的算法绝对不是冒泡排序,但我认为它是有道理的。应该把void isSorted改成boolean isSorted,但是每次for循环调用isSorted方法效率太低了……对不起我的英语不好。
    • 好吧,别担心 :)
    猜你喜欢
    • 2016-03-19
    • 1970-01-01
    • 2021-06-14
    • 2013-09-04
    • 2013-11-02
    • 1970-01-01
    • 2021-02-23
    • 2011-09-27
    • 2016-02-10
    相关资源
    最近更新 更多