数据--第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\n", d1.desc, d2.desc, compare1(&d1, &d2));

    printf("Compare2 %s and %s: %d\n", 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)      排序的时间性能是区分排序算法好坏的主要因素。

posted @ 2019-08-11 18:34  free-锻炼身体  阅读(832)  评论(0编辑  收藏  举报