首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有偶数和偶数数分离的函数的复杂性

问具有偶数和偶数数分离的函数的复杂性
EN

Stack Overflow用户
提问于 2020-10-26 16:34:28
回答 1查看 164关注 0票数 0

所以我有一个数组,里面有偶数和概率数。我必须先用奇数排序,然后再用偶数排序。以下是我的做法:

代码语言:javascript
复制
 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++;
    }
}

首先将偶数和奇数分开,然后对其进行排序。对于排序,我有以下代码:

代码语言:javascript
复制
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 6 10 12 复杂性表

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-26 17:05:21

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

首先划分n元素数组,然后对m元素进行排序,最后对n - m元素进行排序。因此,总的复杂性将是:

代码语言:javascript
复制
A(n) + B(m) + B(n - m)

根据A和B的实际情况,您应该能够进一步简化这一点。

编辑:顺便说一下,除非代码的目标是尝试实现分区/排序算法,否则我相信这一点要清楚得多:

代码语言:javascript
复制
#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保持元素的相对顺序。事实并非如此。修正了代码示例。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64541268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档