【问题标题】:Reverse order of bubble sort of null elements空元素冒泡排序的逆序
【发布时间】:2020-10-29 04:00:56
【问题描述】:

我正在尝试反转我的冒泡排序,以便所有空元素都被推到数组的末尾而不是开头,因为它们现在正在排序。关于如何实现这一点的任何建议?

            for (int outerLoop = 0; outerLoop < students.Length-1; outerLoop++)
            {
                for (int innerLoop = 0; innerLoop < students.Length-1; innerLoop++)
                {
                    if (students[outerLoop+1] == null)
                    {
                        var tempObject = students[outerLoop+1];
                        students[outerLoop+1] = students[innerLoop];  
                        students[innerLoop] = tempObject;
                    }
                }
            }

【问题讨论】:

  • 你已经尝试了什么?
  • 只需修改您的比较逻辑以评估null 大于任何非空值。
  • 您的内部循环中的比较语句在哪里?还是您只想将空值放到底部?
  • @Tarik 是的,没错。我希望它们在底部。
  • 在 if 语句和块中,您应该只使用 innerLoop 索引。您应该检查 students[innerLoop] == null

标签: c# arrays sorting bubble-sort


【解决方案1】:

更正的代码:

        for (int outerLoop = 0; outerLoop < students.Length-1; outerLoop++)
        {
            for (int innerLoop = 0; innerLoop < students.Length-1; innerLoop++)
            {
                if (students[innerLoop] == null)
                {
                    var tempObject = students[innerLoop+1];
                    students[innerLoop+1] = students[innerLoop];  
                    students[innerLoop] = tempObject;
                }
            }
        }

这不会对您的数组进行排序,而只会将空值放在底部。

事实上你可以去掉临时变量:

        for (int outerLoop = 0; outerLoop < students.Length-1; outerLoop++)
        {
            for (int innerLoop = 0; innerLoop < students.Length-1; innerLoop++)
            {
                if (students[innerLoop] == null)
                {
                    students[innerLoop] = students[innerLoop+1];  
                    students[innerLoop+1] = null;
                }
            }
        }

注意: C# 7 introduced tuples 可以在没有临时变量的情况下交换两个变量:

int a = 10;
int b = 2;
(a, b) = (b, a);

这会将b 分配给a 并将a 分配给b

【讨论】:

  • 非常感谢!工作得很好!作为一个新手,要掌握嵌套循环是相当困难的,这太令人沮丧了!关于如何在使用它们时改进思维的任何建议?我经常使用调试器,看看循环是如何迭代的。但是当结合它们时,我往往会失去上下文......
【解决方案2】:

尝试关注。您必须测试外部是否为空,内部是否为空:

            for (int outerLoop = 0; outerLoop < students.Length - 1; outerLoop++)
            {
                for (int innerLoop = outerLoop + 1; innerLoop < students.Length; innerLoop++)
                {
                    if ((students[outerLoop] == null) && (students[innerLoop] != null))
                    {
                        var tempObject = students[outerLoop];
                        students[outerLoop] = students[innerLoop];
                        students[innerLoop] = tempObject;
                    }
                }
            }

【讨论】:

    【解决方案3】:

    O(n) 时间复杂度有一种更快、更简单、更稳定的方法:

      int at = 0;
    
      for (int i = 0; i < students.Length; ++i)
        if (students[i] != null)
          students[at++] = students[i];
    
      for (int i = at; i < students.Length; ++i)
        students[i] = null;
    

    但是,如果你坚持使用冒泡排序:我们可以用一些不同的方式来实现它

      for (bool wrongOrder = true; wrongOrder;) {
        wrongOrder = false;
    
        for (int i = 1; i < students.Length; i++) {
          if (students[i - 1] == null && students[i] != null) {
            // At least 2 items has wrong order, swap them
            var temp = students[i - 1];
            students[i - 1] = students[i];
            students[i] = temp;
    
            wrongOrder = true;
          }
        }
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-18
      • 1970-01-01
      • 2016-04-13
      • 1970-01-01
      • 2013-10-09
      • 1970-01-01
      • 2018-11-17
      • 2021-04-26
      相关资源
      最近更新 更多