028-86922220

建站动态

根据您的个性需求进行定制 先人一步 抢占小程序红利时代

数据结构(11)_排序

1.排序的基本概念

1.1.排序的概念

定义:排序是计算机内经常进行的一种操作,其目的是将一组“无序”的数据调整为“有序”的数据元素。
数学定义:假设含有n个数据元素的序列为{R1,R2...Rn},其相应的关键字序列为:{K1,K2...Kn};这些关键字相互之间进行比较,即:在他们之间存在着这样的一个关系:Kp1 <= Kp2 <= ... <= Kpn按此固有关系将上式重新排列为:{Rp1, Rp2, ... Rpn}的操作称为排序。

创新互联建站专注为客户提供全方位的互联网综合服务,包含不限于做网站、成都网站制作、竹溪网络推广、小程序定制开发、竹溪网络营销、竹溪企业策划、竹溪品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;创新互联建站为所有大学生创业者提供竹溪建站搭建服务,24小时服务热线:13518219792,官方网址:www.cdcxhl.com

1.2.排序的稳定性

数据结构(11)_排序
问题:什么按照总评排序后张无忌的排名比郭靖靠前呢?
排序的稳定性:
如果序列中有两个数据元素Ri和Rj,他们关键字的Ki == Kj,且排序之前,对象Ri排在Rj之前,但排序之后两者的顺序交互,则称这个排序方案是不稳定的。

1.3.多关键字排序

排序时需要比较的关键字有多个,排序结果首先按照关键字1进行,当关键字1相同,按照关键字2进行排序...
数据结构(11)_排序
多关键字的排序并不比单关键字复杂,只需要在定义比较操作时,同时考虑多个关键字即可!
多关键字排序实例:

class MulitKeySort : public Object
{
protected:
    int key1;
    int key2;
public:
    MulitKeySort(int k1, int k2)
    {
        key1 = k1;
        key2 = k2;
    }

    bool operator ==(const MulitKeySort& m)
    {
        return ( (key1==m.key1) && (key2==m.key2));
    }

    bool operator !=(const MulitKeySort& m)
    {
        return !(*this == m);
    }

    bool operator <(const MulitKeySort& m)
    {
        return ( (key1=(const MulitKeySort& m)
    {
        return !(*this < m);
    }

    bool operator >(const MulitKeySort& m)
    {
        return ( (key1>m.key1) || ((key1==m.key1) && (key2>m.key2)));
    }

    bool operator <=(const MulitKeySort& m)
    {
        return !(*this > m);
    }
};

//测试代码:
void test_1()
{
    MulitKeySort m1(3, 4);
    MulitKeySort m2(3, 3);

    cout << (m1 > m2) << endl;
}

1.4.排序的选择

排序中的关键操作

数据结构(11)_排序
数据结构(11)_排序

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;
    }
};

class TestProxy : public Object
{
protected:
    Test* pTest;
public:
    int id()const
    {
        return pTest->id;
    }

    int* data1()const
    {
        return pTest->data1;
    }

    double* data2()const
    {
        return pTest->data2;
    }

    Test& test()const
    {
        return *pTest;
    }

    bool operator >(const TestProxy& obj)
    {
        return test() > obj.test();
    }

    bool operator >=(const TestProxy& obj)
    {
        return test() >= obj.test();
    }

    bool operator <(const TestProxy& obj)
    {
        return test() < obj.test();
    }

    bool operator <=(const TestProxy& obj)
    {
        return test() <= obj.test();
    }

    Test& operator =(Test& test)
    {
        pTest = &test;
        return test;
    }
};

Test t[1000];
TestProxy pt[1000];

void test_3()
{
    clock_t begin = 0;
    clock_t end = 0;

    for(int i=0;i<1000;i++)
    {
        t[i].id = i;
        pt[i] = t[i];
    }

    begin = clock();

    //DTSort::BubbleSort(t,1000,false);
    DTSort::BubbleSort(pt,1000,false);

    end = clock();

    cout << "Time:" << (end - begin) << endl;
    for(int i=0;i<1000;i++)
    {
        //cout << t[i].id << " " << pt[i].id() << endl;
    }

}

使用代理模式:
数据结构(11)_排序
不使用代理模式:
数据结构(11)_排序
两者时间相差超过50倍,可见代码模式的优势。
总结:
1.排序类应当同时支持原生数组和数组类的的排序;
2.当排序元素为体积庞大的对象时,可以考虑使用代理模式简介完成(有效避开大对象交换时的耗时操作),是空间换时间思想的体现。


本文标题:数据结构(11)_排序
文章起源:http://www.tsicrk.com/article/pecjgh.html
  • 网站建设专属方案

  • 网站定制化设计

  • 7X24小时服务

  • N对管家服务

让你的专属顾问为你服务

0.6858s