精选算法题(3)——奇偶数据分离

简介: 精选算法题(3)——奇偶数据分离

题目描述:

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

解题思路:

本题题目简单,但可以拓展一下思路。我用了三种方法,分别是vector存储、list存储、自定义链表存储,以验证计算效率。三种方法均采用遍历思路,遍历过程中将奇数存储在一个容器中,将偶数存储在另一个容器中,然后两容器合并即可。其中,我自定义了一个链表,将奇数链表的尾巴和偶数链表的头进行连接,节省了合并容器的过程,且具备较高的插入效率。文章后续有完整的速度对比方案。

测试代码:

#include <iostream>
#include <string>
#include <vector>
#include <deque>
#include <time.h>
#include <list>
using namespace std;
struct ListNode {
  int val;
  struct ListNode *next;
  ListNode(int x) :
    val(x), next(NULL) {
  }
};
// 判断是否为奇数
bool isOdd(int number)
{
  return (bool)(number % 2);
}
// 奇数偶数分离
vector<int> OddEvenSeparate1(vector<int> input)
{
  vector<int> output;
  vector<int> evens;
  for (int i = 0; i < input.size(); ++i)
  {
    if (isOdd(input[i]))
    {
      output.emplace_back(input[i]);
    }
    else
    {
      evens.emplace_back(input[i]);
    }
  }
  output.insert(output.end(), evens.begin(), evens.end());
  return output;
}
// 奇数偶数分离
list<int> OddEvenSeparate2(vector<int> input)
{
  list<int> output;
  list<int> evens;
  for (int i = 0; i < input.size(); ++i)
  {
    if (isOdd(input[i]))
    {
      output.emplace_back(input[i]);
    }
    else
    {
      evens.emplace_back(input[i]);
    }
  }
  output.splice(output.end(), evens);
  return output;
}
// 奇数偶数分离
ListNode* OddEvenSeparate3(vector<int> input)
{
  ListNode* output = new ListNode(-1);
  ListNode* evens = new ListNode(-1);
  ListNode* ohead = output;
  ListNode* ehead = evens;
  for (int i = 0; i < input.size(); ++i)
  {
    if (isOdd(input[i]))
    {
      ListNode* temp = new ListNode(input[i]);
      output->next = temp;
      output = output->next;
    }
    else
    {
      ListNode* temp = new ListNode(input[i]);
      evens->next = temp;
      evens = evens->next;
    }
  }
  ohead = ohead->next;
  ehead = ehead->next;
  output->next = ehead;
  return ohead;
}
int main()
{
  // 给定数组
  vector<int> a(10000);
  for (int i = 0; i < a.size(); ++i)
  {
    a[i] = rand();
  }
  clock_t s, e;
  // 奇数偶数分离
  // 第一种方法
  s = clock();
  vector<int> b1 = OddEvenSeparate1(a);
  e = clock();
  cout << "time1:" << e - s << endl;
  cout << "first:" << endl;
  for (auto i : b1)
  {
    cout << i << " ";
  }
  cout << endl;
  // 第二种方法
  s = clock();
  list<int> b2 = OddEvenSeparate2(a);
  e = clock();
  cout << "time2:" << e - s << endl;
  cout << "second:" << endl;
  for (auto i : b2)
  {
    cout << i << " ";
  }
  cout << endl;
  // 第三种方法
  s = clock();
  ListNode* b3 = OddEvenSeparate3(a);
  e = clock();
  cout << "time3:" << e - s << endl;
  cout << "third:" << endl;
  while (b3 != nullptr)
  {
    cout << b3->val << " ";
    b3 = b3->next;
  }
  cout << endl;
  system("pause");
  return 0;
}

测试结果:

      当输入数组为10个数字时,验证下三种方法的准确性,如图1所示。

图1 验证准确性

      当输入数组为1000万时,debug下的速度如图2所示。

图2 release下速度对比

     当输入数组为1000万时,release下的速度如图3所示。

图3 debug下速度对比

      从上图可以看出,debug模式下自定义链表速度最快,但是release模式下vector速度最快,且自定义链表相对于STL中的list略快。


      如果代码有什么需要改进的或者有什么bug,欢迎评论留言,我会及时更正以免误导他人~


      如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

相关文章
|
3月前
|
数据采集 机器学习/深度学习 算法
【优秀设计案例】基于K-Means聚类算法的球员数据聚类分析设计与实现
本文通过K-Means聚类算法对NBA球员数据进行聚类分析,旨在揭示球员间的相似性和差异性,为球队管理、战术决策和球员评估提供数据支持,并通过特征工程和结果可视化深入理解球员表现和潜力。
132 1
【优秀设计案例】基于K-Means聚类算法的球员数据聚类分析设计与实现
|
24天前
|
存储 编解码 负载均衡
数据分片算法
【10月更文挑战第25天】不同的数据分片算法适用于不同的应用场景和数据特点,在实际应用中,需要根据具体的业务需求、数据分布情况、系统性能要求等因素综合考虑,选择合适的数据分片算法,以实现数据的高效存储、查询和处理。
|
24天前
|
存储 缓存 算法
分布式缓存有哪些常用的数据分片算法?
【10月更文挑战第25天】在实际应用中,需要根据具体的业务需求、数据特征以及系统的可扩展性要求等因素综合考虑,选择合适的数据分片算法,以实现分布式缓存的高效运行和数据的合理分布。
|
1月前
|
机器学习/深度学习 人工智能 算法
"拥抱AI规模化浪潮:从数据到算法,解锁未来无限可能,你准备好迎接这场技术革命了吗?"
【10月更文挑战第14天】本文探讨了AI规模化的重要性和挑战,涵盖数据、算法、算力和应用场景等方面。通过使用Python和TensorFlow的示例代码,展示了如何训练并应用一个基本的AI模型进行图像分类,强调了AI规模化在各行业的广泛应用前景。
31 5
|
28天前
|
存储 JSON 算法
TDengine 检测数据最佳压缩算法工具,助你一键找出最优压缩方案
在使用 TDengine 存储时序数据时,压缩数据以节省磁盘空间是至关重要的。TDengine 支持用户根据自身数据特性灵活指定压缩算法,从而实现更高效的存储。然而,如何选择最合适的压缩算法,才能最大限度地降低存储开销?为了解决这一问题,我们特别推出了一个实用工具,帮助用户快速判断并选择最适合其数据特征的压缩算法。
35 0
|
1月前
|
人工智能 算法 前端开发
无界批发零售定义及无界AI算法,打破传统壁垒,累积数据流量
“无界批发与零售”是一种结合了批发与零售的商业模式,通过后端逻辑、数据库设计和前端用户界面实现。该模式支持用户注册、登录、商品管理、订单处理、批发与零售功能,并根据用户行为计算信用等级,确保交易安全与高效。
|
1月前
|
前端开发 算法 JavaScript
无界SaaS模式深度解析:算力算法、链接力、数据确权制度
私域电商的无界SaaS模式涉及后端开发、前端开发、数据库设计、API接口、区块链技术、支付和身份验证系统等多个技术领域。本文通过简化框架和示例代码,指导如何将核心功能转化为技术实现,涵盖用户管理、企业店铺管理、数据流量管理等关键环节。
|
1月前
|
机器学习/深度学习 算法 数据处理
EM算法对人脸数据降维(机器学习作业06)
本文介绍了使用EM算法对人脸数据进行降维的机器学习作业。首先通过加载ORL人脸数据库,然后分别应用SVD_PCA、MLE_PCA及EM_PCA三种方法实现数据降维,并输出降维后的数据形状。此作业展示了不同PCA变种在人脸数据处理中的应用效果。
35 0
|
1月前
|
存储 算法 搜索推荐
算法进阶之路:Python 归并排序深度剖析,让数据排序变得艺术起来!
算法进阶之路:Python 归并排序深度剖析,让数据排序变得艺术起来!
72 0
下一篇
无影云桌面