项目中的排序工程

Posted 勇士后卫头盔哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了项目中的排序工程相关的知识,希望对你有一定的参考价值。

前言

struct Test : public Object

   int id;
   int data1[1000];                  
   double data2[500];

..................
Test t[1000]
Sort::Bubble(t,1000,false);

如上述代码所示,如果当待排数据元素为体积庞大的对象时,如何提高排序的效率,大家肯定会想到用更高效的排序方法来提高效率,但是发现效率的提高是微不足道的,问题的关键在于排序过程中不可避免的需要进行交换操作,交换操作的本质为数据元素间的相互复制,当数据元素体积较大时,交换操作耗时巨大,所以解决方案为:代理模式

代理模式

定义:代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用,通俗的来讲代理模式就是我们生活中常见的中介.
举个例子来说明:
假如说我现在想买一辆二手车,虽然我可以自己去找车源,做质量检测等一系列的车辆过户流程,但是这确实太浪费我得时间和精力了,我只是想买一辆车而已为什么我还要额外做这么多事呢?于是我就通过中介公司来买车,他们来给我找车源,帮我办理车辆过户流程,我只是负责选择自己喜欢的车,然后付钱就可以了.用图表示如下:

排序中的代理模式
1.为待排数据元素设置代理对象
2.对代理对象所组成的序列进行排序
3.需要访问有序数据元素时,通过访问代理序列完成

如下图所示,我们会在代码里面创建一个代理对象出来并且在初始化的时候,让代理对象一对一的代理原始的数据元素,接着使用具体的排序函数对代理对象进行排序

代码演示

未使用代理模式前的执行时间

#include <iostream>
#include <ctime>
#include "Sort.h"
#include "StaticArray.h"
using namespace std;
using namespace CGSLib;
struct Test : public Object

    int id;
    int data1[1000];
    double data2[500];
    bool operator <(const Test& obj)
    
       return id < obj.id;
    
    bool operator >=(const Test& obj)
    
       return id >= obj.id;
    
    bool operator >(const Test& obj)
    
       return id > obj.id;
    
    bool operator <=(const Test& obj)
    
       return id <= obj.id;
    
;
int main()

    clock_t begin,end = 0;
    Test t[50];
    for(int i=0;i<1000;i++)
    
        t[i].id = i;
    
    begin = clock();
    Sort::Bubble(t,50,false);
    end   = clock();
    cout<<"Time: "<<(end-begin)<<endl;
    return 1;

时间

1395

使用代理模式

class TestProxy : public Object

  protected:
    Test* m_pTest;
  public:
    int id()
    
        return m_pTest->id;
    
    int* data1()
    
        return m_pTest->data1;
    
    int* data2()
    
       return m_pTest->data2;
    
    Test& test()
    
       return *m_pTest;
    
    bool operator <( TestProxy& obj)
    
        return test() < obj.test();
    
    bool operator >( TestProxy& obj)
    
        return test() > obj.test();
    
    bool operator <=( TestProxy& obj)
    
        return test() <= obj.test();
    
    bool operator >=( TestProxy& obj)
    
        return test() >= obj.test();
    
    Test& operator = (Test& test)
    
        m_pTest = &test;
        return test;
    
;

总结:

代理模式的使用有效避开大对象交换时的耗时操作,代理模式解决方案是空间换时间的思想的体现

以上是关于项目中的排序工程的主要内容,如果未能解决你的问题,请参考以下文章

使用firebase排序最近的地方(android)[重复]

2017汽车工程学院 车辆工程 赵浩然

2017 汽车工程学院 车辆工程 周金霖

2017 汽车工程学院 车辆工程 梁佳乐

2017 汽车工程学院 车辆工程 周金霖

2017 汽车工程学院 车辆工程 吴昊