【问题标题】:Complexity of function with array having even and odds numbers separate具有偶数和奇数分开的数组的函数复杂性
【发布时间】:2021-02-08 22:54:35
【问题描述】:

所以我有一个数组,其中包含偶数和奇数。 我必须先用奇数排序,然后再用偶数排序。 这是我的处理方法:

 int key,val;
int odd = 0;
int index = 0;

for(int i=0;i<max;i++)
{
    if(arr[i]%2!=0)
    {
        int temp = arr[index];
        arr[index] = arr[i];
        arr[i] = temp;
        index++;
        odd++;
    }
}

首先我将偶数和奇数分开,然后对其应用排序。 对于排序,我有这个代码:

for (int i=1; i<max;i++)
{
    key=arr[i];
    
    if(i<odd)
    {
       val = 0;
    }
    if(i>=odd)
    {
        val = odd;
    }
    
    for(int j=i; j>val && key < arr[j-1]; j--)
    {
        arr[j] = arr[j-1];
        arr[j-1] = key;
    }
}

我面临的问题是我找不到上述排序代码的复杂性。 像插入排序一样应用于第一个奇数。 完成后,我跳过那部分并开始对偶数进行排序。 如果我对数组进行了排序,这是我的排序方法,例如:3 5 7 9 2 6 10 12 complexity table

这一切如何运作? 在第一个 for 循环中,我遍历循环并将所有奇数放在偶数之前。 但是因为它没有对它们进行排序。 在下一个具有插入排序的 for 循环中。我基本上所做的只是使用 if 语句在数组中首先对奇数进行排序。然后当 i == odd 嵌套的 for 循环时,它不会遍历所有奇数,而是只计算偶数,然后对它们进行排序。

【问题讨论】:

  • 什么是index?请阅读minimal reproducible example。
  • 你能解释一下你的排序算法吗?
  • @JohnFilleau 立即查看
  • @Stef 如果你能看懂,现在可以在底部查看

标签: c++ sorting time-complexity insertion-sort code-complexity


【解决方案1】:

我假设您知道分区(比如说A)和排序算法(我们称之为B)的复杂性。

您首先对n 元素数组进行分区,然后对m 元素进行排序,最后对n - m 元素进行排序。所以总的复杂度是:

A(n) + B(m) + B(n - m)

根据 A 和 B 实际上是什么,您应该能够进一步简化它。

编辑:顺便说一句,除非您的代码的目标是尝试实现分区/排序算法,否则我相信这会更清楚:

#include <algorithm>
#include <iterator>

template <class T>
void partition_and_sort (T & values) {
  auto isOdd = [](auto const & e) { return e % 2 == 1; };
  auto middle = std::partition(std::begin(values), std::end(values), isOdd);
  std::sort(std::begin(values), middle);
  std::sort(middle, std::end(values));
}

本例中的复杂度为O(n) + 2 * O(n * log(n)) = O(n * log(n))。

编辑 2: 我错误地假设 std::partition 保持元素的相对顺序。事实并非如此。修复了代码示例。

【讨论】:

  • 我明白你的意思,但是 (n-m) 的复杂性是多少我发现很难找到那部分的复杂性
  • @abdullah (n - m) 是由常量n 和变量m 组成的变量。它没有复杂性,它只是一个值。您可以找出它的最小值和最大值,以确定整个算法的最佳和最坏情况复杂度
  • 复杂度通常用于让您了解某种算法需要多长时间。但是这个符号隐藏了很多东西,例如恒定的时间。例如,如果你想对 100 个元素进行排序,那么如果 O(n) 实际上是 O(n) + 22 seconds,O(n^2) 算法可能比 O(n) 算法更快。所以对于实际的实现,你仍然需要测量。参见例如en.wikipedia.org/wiki/Computational_complexity.
  • 所以它会保持原样。像 A(n) + B(m) + B(n-m) 他们不能被进一步简化。?
  • @JohnFilleau 对不起,如果这很愚蠢,但如果我们得到像 n + m + (n-m) 这样的复杂性。那么我们可以将它简化为----> n + m + n - m => 2n => n ??????
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-04
相关资源
最近更新 更多