• 数据--第26课


    第26课 - 排序的概念及分类

    疑问:既然已经存在的排序算法基本上都有现成的实现了。我们需要的时候直接调用就可以了,为什么还要学习呢?你不是说要代码复用吗?

    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. 排序的稳定性

    如果在序列中有两个数据元素r[i]和r[j],它们的关键字k[i] == k[j],且在排序之前,对象r[i]排在r[j]前面。如果在排序之后,对象r[i]仍在对象r[j]的前面,则称这个排序方法是稳定的,否则称这个排序方法是不稳定的。

    4. 多关键排序

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

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

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

    ……

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

    5. 排序中的关键操作

    比较

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

    交换

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

    对于多关键字排序,只需要在比较操作时间时考虑多个关键字即可。

    例子:

    #include <stdio.h>

    typedef struct _tag_DataElem

    {

        char desc[20];

        int key1;

        int key2;

    } DataElem;

    int compare1(DataElem* ld, DataElem* rd)

    {

        int ret = 0;

       

        if( ld->key1 > rd->key1 )

        {

            ret = 1;

        }

        else if( ld->key1 == rd->key1 )

        {

            if( ld->key2 > rd->key2 )

            {

                ret = 1;

            }

           

            if( ld->key2 < rd->key2 )

            {

                ret = -1;

            }

        }

        else

        {

            ret = -1;

        }

       

        return ret;

    }

    int compare2(DataElem* ld, DataElem* rd)

    {

        return (ld->key1*100 + ld->key2) - (rd->key1*100 + rd->key2);

    }

    int main()

    {

        DataElem d1 = {"d1", 91, 80};

        DataElem d2 = {"d2", 91, 88};

       

        printf("Compare1 %s and %s: %d ", d1.desc, d2.desc, compare1(&d1, &d2));

        printf("Compare2 %s and %s: %d ", d1.desc, d2.desc, compare2(&d1, &d2));

       

        return 0;

    }

    运行结果:

    Compare1 d1 and d2: -1

    Compare2 d1 and d2: -8

    6. 内排序和外排序

    内排序:整个过程不需要访问外存便能完成。

    外排序:待排序的数据元素数量很大,整个序列的排序过程不可能在内存中完成。

    7. 排序的审判

    时间性能

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

    辅助存储空间

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

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

    算法的实现复杂性

     过于复杂的排序法会影响代码的可读性和可维护性,也可能影响排序的性能。

    小结:

    (1)      排序是数据元素从无序到有序的过程。

    (2)      排序具有稳定性,是选择排序算法的因素之一。

    (3)      比较和交换是排序的基本操作。

    (4)      多关键字排序与单关键字排序无本质区别。

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

  • 相关阅读:
    C# 将Excel中的数据到DataSet中
    Struts select标签在 FreeMarker 中的使用。
    .Net 中显式实现接口
    C#抽象类和抽象方法的应用
    iframe 自动控制高
    兔子问题总结(总结)
    MySQL group_concat 方法的使用
    服务发现与负载均衡机制的实现
    ChannelFuture
    服务发布、订阅及远程通信
  • 原文地址:https://www.cnblogs.com/free-1122/p/11336003.html
Copyright © 2020-2023  润新知