第46课 - 排序的基本概念

1、排序的—般定义 

        排序是计算机内经常进行的—种操作,其目的是将一组“无 

        序”的数据元素调整为“有序”的数据元素。 

            例如:将下列关键字序列 

                        52,49,80,36,14,58, 61,23,97, 75 

            调整为 

                        14,23,36,49,52,58, 61,75,80,97 


2、排序的数学定义 

            假设合n个数据元素的序列为: { R1 R2 , ... , Rn} , 其相

             应的关键字序列为: { K1 K2 , ... , Kn } ; 


            这些关键字相互之间可以进行比较,即:在它们之间存在 

            着这样—个关系: Kp1 <= Kp2 <=...<= Kpn


            按此固有关系将上式记录序列重新排列为: 

                        { Rp1 Rp2 , ... ,Rpn 

            的操作称为 排序。 


3、排序的示例 

            

4、问题

            按总评排序后为什么张无忌的排名比郭靖靠前呢? 


5、排序的稳定性 

                如果在序列中有两个数据元素 r[i] 和 r[j]它们的关键字 

                k[i]== k[j] 且在排序之前,对象 r[i] 排在 r[j] 前面;如 

                果在排序之后,对象 r[i] 仍在对象 r[j] 的前面,则称这个 

                排序方法是稳定的,否则称这个排序方法是不稳定的。


      稳定性排序示例 

            


6、多关键字排序 

         - 排序时需要比较的关键字多余—个 

                排序结果首先按关键字1进行排序 

                当关键字1相同时按关键字2进行排序 

                ....

                当关键字n-1相同时按关键字n进行排序


        多关键字排序示例 

            


7、问题 

                多关键字排序是否比单关键字排序更复杂?


                    对于多关键字排序,只需要在比较操 

                    作时同时考虑多个关键字即可!! 


8、编程实验 

多关键字比较操作

#include <iostream>
#include"Object.h"

using namespace std;
using namespace DTLib;

struct Test : public Object
{
    int key1;    //high priority
    int key2;

    Test(int k1,int k2)
    {
        key1 = k1;
        key2 = k2;
    }
    bool operator == (const Test& t)
    {
        return (key1 == t.key1) && (key2 == t.key2);
    }
    bool operator != (const Test& t)
    {
        return !(*this == t);
    }
    bool operator < (const Test& t)
    {
        return (key1 < t.key1) || ((key1 == t.key1) && (key2 < t.key2));
    }
    bool operator >= (const Test& t)
    {
        return !(*this < t);
    }
    bool operator > (const Test& t)
    {
        return (key1 > t.key1) || ((key1 == t.key1) && (key2 > t.key2));
    }
    bool operator <= (const Test& t)
    {
        return !(*this > t);
    }
};

int main()
{
    Test t1(3,4);
    Test t2(2,5);
    Test t3(3,4);
    Test t4(3,5);

    cout<<(t1 > t2)<<endl;    //1
    cout<<(t3 < t4)<<endl;    //1



    return 0;
}

9、排序中的关键操作 

        -比较 

                任意两个数据元素通过比较操作确定先后次序 

        -交换 

                数据元素之间需要交换才能得到预期结果


10、排序的审判 

         - 时间性能 

                关键性能差异体现在比较和交换的数量 

        -辅助存储空间 

                为完成排序操作需要的额外的存储空间 

                必要时可以“空间换时间” 

        -算法的实现复杂性 

                过于复杂的排序法可能影响可读性和可维护性


11、DTLib中的排序类设计

                            

        

12、编程实验 

DTLib中的排序类 class Sort;

Sort.h

#ifndef SORT_H
#define SORT_H

#include"Object.h"

namespace DTLib
{

class Sort : public Object
{
private:
    Sort();
    Sort(const Sort&);
    Sort& operator = (const Sort&);

    template <typename T>
    static void swap(T& a,T& b)
    {
        T t(a);
        a = b;
        b = t;
    }
public:

};
}


#endif // SORT_H

13、小结 

            排序是数据元素从无序到有序的过程 

            排序具有稳定性,是选择排序算法的因素之— 

            比较和交换是排序的基本操作 

            多关键字排序与单关键字排序无本质区别 

            排序的时间性能是区分排序算法好坏的主要因素


猜你喜欢

转载自blog.csdn.net/qq_39654127/article/details/80412140