精选算法题(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,欢迎评论留言,我会及时更正以免误导他人~


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

相关文章
|
19天前
|
传感器 机器学习/深度学习 算法
【使用 DSP 滤波器加速速度和位移】使用信号处理算法过滤加速度数据并将其转换为速度和位移研究(Matlab代码实现)
【使用 DSP 滤波器加速速度和位移】使用信号处理算法过滤加速度数据并将其转换为速度和位移研究(Matlab代码实现)
105 1
|
25天前
|
机器学习/深度学习 算法 调度
14种智能算法优化BP神经网络(14种方法)实现数据预测分类研究(Matlab代码实现)
14种智能算法优化BP神经网络(14种方法)实现数据预测分类研究(Matlab代码实现)
152 0
|
2月前
|
机器学习/深度学习 Dragonfly 人工智能
基于蜻蜓算法优化支持向量机(DA-SVM)的数据多特征分类预测研究(Matlab代码实现)
基于蜻蜓算法优化支持向量机(DA-SVM)的数据多特征分类预测研究(Matlab代码实现)
|
3月前
|
传感器 机器学习/深度学习 分布式计算
卡尔曼滤波的多传感器数据融合算法
卡尔曼滤波的多传感器数据融合算法
332 0
|
16天前
|
存储 监控 算法
企业电脑监控系统中基于 Go 语言的跳表结构设备数据索引算法研究
本文介绍基于Go语言的跳表算法在企业电脑监控系统中的应用,通过多层索引结构将数据查询、插入、删除操作优化至O(log n),显著提升海量设备数据管理效率,解决传统链表查询延迟问题,实现高效设备状态定位与异常筛选。
58 3
|
5月前
|
存储 监控 算法
基于 C++ 哈希表算法实现局域网监控电脑屏幕的数据加速机制研究
企业网络安全与办公管理需求日益复杂的学术语境下,局域网监控电脑屏幕作为保障信息安全、规范员工操作的重要手段,已然成为网络安全领域的关键研究对象。其作用类似网络空间中的 “电子眼”,实时捕获每台电脑屏幕上的操作动态。然而,面对海量监控数据,实现高效数据存储与快速检索,已成为提升监控系统性能的核心挑战。本文聚焦于 C++ 语言中的哈希表算法,深入探究其如何成为局域网监控电脑屏幕数据处理的 “加速引擎”,并通过详尽的代码示例,展现其强大功能与应用价值。
120 2
|
6月前
|
数据采集 机器学习/深度学习 算法
别急着上算法,咱先把数据整明白:大数据分析的5个基本步骤,你都搞对了吗?
别急着上算法,咱先把数据整明白:大数据分析的5个基本步骤,你都搞对了吗?
277 4
|
1月前
|
算法 数据挖掘 定位技术
基于密度的聚类算法能够在含有噪声的数据集中识别出任意形状和大小的簇(Matlab代码实现)
基于密度的聚类算法能够在含有噪声的数据集中识别出任意形状和大小的簇(Matlab代码实现)
|
1月前
|
机器学习/深度学习 数据采集 运维
改进的遗传算法优化的BP神经网络用于电厂数据的异常检测和故障诊断
改进的遗传算法优化的BP神经网络用于电厂数据的异常检测和故障诊断
|
2月前
|
机器学习/深度学习 传感器 边缘计算
【轴承故障诊断】基于融合鱼鹰和柯西变异的麻雀优化算法OCSSA-VMD-CNN-BILSTM轴承诊断研究【西储大学数据】(Matlab代码实现)
【轴承故障诊断】基于融合鱼鹰和柯西变异的麻雀优化算法OCSSA-VMD-CNN-BILSTM轴承诊断研究【西储大学数据】(Matlab代码实现)

热门文章

最新文章