数据结构(11)_排序

发布时间:2020-04-05 22:47:52 作者:三九感冒灵
来源:网络 阅读:576

1.排序的基本概念

1.1.排序的概念

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

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<m.key1) || ((key1==m.key1) && (key2<m.key2)));
    }

    bool operator >=(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.当排序元素为体积庞大的对象时,可以考虑使用代理模式简介完成(有效避开大对象交换时的耗时操作),是空间换时间思想的体现。

推荐阅读:
  1. PHP系列(三)PHP数组与数据结构
  2. 数据结构和算法 其一

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

数据结构 排序 代理模式

上一篇:数源思维完成目标设定

下一篇:meta标签的另一个用法

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》