使用二进制方法的更快的冒泡排序变体

时间:2019-04-21 17:48:02

标签: c# algorithm sorting bubble-sort bucket-sort

我一直在做一些面试问题的准备工作,在此过程中,我在Bubble Sort上提出了一个小变体,将我对二进制搜索的了解融入了交换的内循环中。因此,时间复杂度比O(n ^ 2)大约降低了50%。我想我的问题是我是在浪费我的时间在冒泡排序吗?我应该学习桶分类并完成它吗?

我一直在用以下输入进行测试。

int[] nums = { 9878, 1, 4, 8, 5, 7, 88, 1, 54, 2, 2, 9878, 5, 7, 3, 11, 1, 4, 8, 5, 7, 88, 1, 54, 2, 2, 5, 7, 3, 11 };

public static int[] sortWBinary(int[] ar)
{
      var swapped = true;
      for (int i = 0; i < ar.Length && swapped; i++)
      {
          swapped = false;
          for (int k = i, j = ar.Length - 1; k < ar.Length - i - 1 && j > 0; k++, j--)
          {
              if (ar[k] > ar[k + 1])
              {
                  var temp = ar[k];
                  ar[k] = ar[k + 1];
                  ar[k + 1] = temp;
                  swapped = true;
              }

              if (ar[j - 1] > ar[j])
              {
                  var temp = ar[j - 1];
                  ar[j - 1] = ar[j];
                  ar[j] = temp;
                  swapped = true;
              }

          }
      }

      return ar;
  }

VS。

public static int[] sortWoBinary(int[] ar)
{
    var swapped = true;
    for (int i = 0; i < ar.Length && swapped; i++)
    {
        swapped = false;
        for (int k = 0; k < ar.Length - i - 1; k++)
        {
            if (ar[k] > ar[k + 1])
            {
                var temp = ar[k];
                ar[k] = ar[k + 1];
                ar[k + 1] = temp;
                swapped = true;
            }
        }
    }
    return ar;
}

1 个答案:

答案 0 :(得分:-1)

要进行排序,请了解O(n log(n))O(n^2)之间的区别,并知道如果您有足够的数据来关心自己的工作,就总是希望使用前者。

这里是您需要谈论的所有类型的排序。如果要面试您,我只关心您知道前两个。在告诉您如何编写后,我可能会要求您实施第三个,但是我不在乎您是否知道它。

  1. 您图书馆中的任何物品。任何不知道首先达到这个目标的程序员都是对其代码库的危险,因此不应出于这种原因而被雇用。
  2. 外部排序工具,例如Unix sort实用程序或SQL中的ORDER BY函数。当您需要抛弃数据并做出选择时,请不要将其吸入内存以对其进行排序,而是先将其排序为效率更高的地方。
  3. 合并排序。 (对于专家。)我一生中确实需要写两次排序,而前两个选项还不够。两次都是同一故事。太多的数据无法使用库例程,并且由于一系列复杂的原因,不适合使用外部工具。因此,它必须是外部排序(即,中间文件不在磁盘上的内存中)。如果您需要编写外部排序,则合并排序是您的朋友。
  4. 快速排序。 (在接受专家采访时。)有时,有人会问您图书馆的分类工作原理。我会说:“它有很多工作方式,但是很长一段时间以来,快速排序一直是标准。您要我展示一下它是如何工作的吗?”通常这就是他们想要的答案。很少有人知道快速排序已被timsort取代。确实有更多人可以挖掘并得知:“在本世纪中,平台一直在向timsort过渡。它是为Python发明的,并已被Java,Chrome和其他平台采用。我必须研究一下它的工作原理。 “
  5. 基数排序。 (当接受smartasses采访时。)如果有人问您您的排序速度是否比O(n log(n))快,您将需要了解这一点。知道答案可能会导致他们更加努力地证明他们的书呆子证书比您的书呆子证书更好。这将是我不想与他们合作的标志。