【问题标题】:Sort Ascending or Descending inside a Bubble-Sort冒泡排序中的升序或降序排序
【发布时间】:2009-12-06 18:28:58
【问题描述】:

this was answered 之后,我继续编写代码。 这样就完美了:

static String[][] bubbleSort(String customerdata[][], int sortafter, int asc)
 {
    String temp [];
    boolean sort;

        do{
             sortiert = true;

             for (int i = 0  ; i < customerdata.length - 1; i++){
                 if(customerdata[i][sortafter].compareTo(customerdata[i+1][sortafter]) < 0){
                     temp = customerdata[i];
                     customerdata[i] = customerdata[i+1];
                     customerdata[i+1] = temp;

                     sort = false;
                 }
             }

         }while(!sort);

  return customerdata;
 }

但是正如你所看到的,我在这个函数中缺少 int asc。我想要的是另外返回一个排序的降序或升序数组(取决于 asc == 1 (asc) 还是 asc == 0 (desc))。

我不知道如何在其中实现它。我的意思是目前我可以对它进行升序或降序排序,但是一旦使用一些讨厌的长 for() 和 if() 循环调用此方法。

我想把它紧凑地放在里面,根据我给出的是bubblesort(x,0,0)还是(x,0,1),列表应该以降序或升序返回。

【问题讨论】:

  • 添加作业标签,或退出编程。冒泡排序并不严重,除非用于学校实验
  • 不一定是功课,他可以自学。此外,只有 5 个标签的空间。我们都知道冒泡排序很糟糕,现在让我们尝试学习一些东西!
  • 博卓有什么问题吗?让我猜猜,你是天生的程序员?
  • 不,但是当我做冒泡排序时,我是在阅读教程并理解它们,而不是浪费别人的时间。
  • 就像我说的,你显然是天生的程序员。怎么样:不要再浪费我的时间,不要读你不喜欢的东西?与其他人相比,到目前为止对您没有任何帮助。

标签: java arrays sorting return-value bubble-sort


【解决方案1】:

简单的解决方案:你能把asc 变成1-1 之一吗?

那么你只需要改变一行:

if(asc * customerdata[i][sortafter].compareTo(customerdata[i+1][sortafter]) < 0)

【讨论】:

  • 现在这是我最简单的方法。谢谢!
【解决方案2】:

升序排序意味着i 的元素小于i + 1 的元素。降序排序意味着i 处的元素大于i + 处的元素。诀窍是翻转你决定元素是否不合适的逻辑。具体来说,这一行:

if(customerdata[i][sortafter].compareTo(customerdata[i+1][sortafter]) < 0){

应该改为

if(customerdata[i][sortafter].compareTo(customerdata[i+1][sortafter]) > 0){

如果你想翻转排序的顺序。

【讨论】:

  • 他在问他如何将这个添加到代码中,有条件的参数......他已经知道如何更改排序
  • 是的,这回答了我的问题。可以在 do 循环中使用 if(asc == 0) 和 else 来解决。高效的?并不真地。作品?哎呀!
【解决方案3】:

您始终可以升序排序,如果需要降序,则只需将其反转。这是一个问题,在循环内重复“if”测试是否比另一个数组遍历效率低。

我假设数组的大小相对较小。冒泡排序是出了名的低效,除了小数组外不应该使用。

【讨论】:

  • 是的,我知道冒泡排序是多么的低效,但我仍在学习 Java,我不习惯仅仅因为它们效率低下而跳过几章。无论哪种方式,我都想了解它是如何工作的。
  • 仅作记录,我认为即使使用 BubbleSort,您的代码也没有我在手术台上看到的一些“专业”代码那么可怕 :) 不过,我想请您用(比如说)2个空格替换前导标签,以便于阅读。
【解决方案4】:

试试这个:

 for (int i = 0  ; i < customerdata.length - 1; i++){
      if(customerdata[i+asc][sortafter].compareTo(customerdata[i+1-asc][sortafter]) < 0){
           temp = customerdata[i];
           customerdata[i] = customerdata[i+1];
           customerdata[i+1] = temp;

           sort = false;
      }
 }

Asc 可以是 0 或 1(升序或降序...)

通过将它添加到您的索引中,您基本上可以交换 if 语句,而无需添加另一个 if ;^)

(注意我改变了两个位置:“+ asc”和“- asc”)

编辑: 不要忘记在第一行添加一个大断言,确保 Asc 真的不能是 0 或 1 ;^)

【讨论】:

  • 是的,assert 是个好主意,异常也尝试 n catch。如果用户应该输入除 0 或 1 之外的其他内容。
【解决方案5】:

如果您想要“软件工程”类型的答案而不是我上面给出的快速破解答案,您可以传递一个仿函数(搜索 Comparator 类)来进行比较,以实现最终灵活的搜索。

【讨论】:

    猜你喜欢
    • 2021-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多