zoukankan      html  css  js  c++  java
  • 排序(sort)

    1、定义

    排序

        所谓排序,就是要整理文件中的记录,使之按关键字递增(或递减)次序排列起来。其确切定义如下:

        输入:n个记录R1,R2,…,Rn,其相应的关键字分别为K1,K2,…,Kn。

        输出:Ril,Ri2,…,Rin,使得Ki1≤Ki2≤…≤Kin,或Ki1≥Ki2≥…≥Kin。

    记录

        被排序的对象--文件由一组记录组成。

        记录则由若干个数据项(或域)组成。其中有一项可用来标识一个记录,称为关键字项。该数据项的值称为关键字(Key)。

    注意:

        在不易产生混淆时,将关键字项简称为关键字。

    关键字

        用来作排序运算依据的关键字,可以是数字类型,也可以是字符类型。

        关键字的选取应根据问题的要求而定。

        【例】在高考成绩统计中将每个考生作为一个记录。每条记录包含准考证号、姓名、各科的分数和总分数等项内容。若要惟一地标识一个考生的记录,则必须用"准考证号"作为关键字。若要按照考生的总分数排名次,则需用"总分数"作为关键字。

    2、排序的稳定性

        当待排序记录的关键字均不相同时,排序结果是惟一的,否则排序结果不唯一。

        在待排序的文件中,若存在多个关键字相同的记录,经过排序后这些具有相同关键字的记录之间的相对次序保持不变,该排序方法是稳定的;若具有相同关键字的记录之间的相对次序发生变化,则称这种排序方法是不稳定的。

        注意:

        排序算法的稳定性是针对所有输入实例而言的。即在所有可能的输入实例中,只要有一个实例使得算法不满足稳定性要求,则该排序算法就是不稳定的。

    3、分类

        (1)按是否涉及数据的内、外存交换分

        在排序过程中,若整个文件都是放在内存中处理,排序时不涉及数据的内、外存交换,则称之为内部排序(简称内排序);反之,若排序过程中要进行数据的内、外存交换,则称之为外部排序。

        注意:

        ① 内排序适用于记录个数不很多的小文件;

        ② 外排序则适用于记录个数太多,不能一次将其全部记录放人内存的大文件。

        (2)按策略划分内部排序方法

        可以分为五类:插入排序(直接插入排序希尔排序)、选择排序(直接选择排序堆排序)、交换排序(冒泡排序快速排序)、归并排序和分配排序(箱排序、基数排序)。

    4、顺序存储结构

    #define MAXSIZE 10    /*用于要排序数组个数最大值,可根据需要修改*/
    
    typedef struct
    {
        int data[MAXSIZE+1];    /*用于存储要排序的数组,data[0]用作哨兵或临时变量*/
        int length;            /*用于记录顺序表的长度*/
    }SqList;

    或者如下定义存储结构:

    #define n l00         //假设的文件长度,即待排序的记录数目
    typedef int KeyType; //假设的关键字类型
      
    typedef struct      //记录类型
    { 
        KeyType key;       //关键字项
        InfoType otherinfo;//其它数据项,类型InfoType依赖于具体应用而定义,这里可以是数据长度length
    }RecType;
    
    typedef RecType SeqList[n+1];//SeqList为顺序表类型,表中第0个单元一般用作哨兵

        注意:

        若关键字类型没有比较算符,则可事先定义宏或函数来表示比较运算。

        【例】关键字为字符串时,可定义宏"#define LT(a,b)(Stromp((a),(b))<0)"。那么算法中"a<b"可用"LT(a,b)"取代。若使用C++,则定义重载的算符"<"更为方便。

    5、算法分析

        (1)排序算法的基本操作

         大多数排序算法都有两个基本的操作:

      a、比较两个关键字的大小;

      b、改变指向记录的指针或移动记录本身。

      注意:

         第b种基本操作的实现依赖于待排序记录的存储方式。

        (2)待排文件的常用存储方式

        a、以顺序表(或直接用向量)作为存储结构

        排序过程:对记录本身进行物理重排(即通过关键字之间的比较判定,将记录移到合适的位置)

        b、以链表作为存储结构

      排序过程:无须移动记录,仅需修改指针。通常将这类排序称为链表(或链式)排序;

        c、用顺序的方式存储待排序的记录,但同时建立一个辅助表(如包括关键字和指向记录位置的指针组成的索引表)

        排序过程:只需对辅助表的表目进行物理重排(即只移动辅助表的表目,而不移动记录本身)。适用于难于在链表上实现,仍需避免排序过程中移动记录的排序方法。

        (3)排序算法性能评价

        a、评价排序算法好坏的标准

        评价排序算法好坏的标准主要有两条:

        ① 执行时间和所需的辅助空间;

        ② 算法本身的复杂程度。

        b、排序算法的空间复杂度

        若排序算法所需的辅助空间并不依赖于问题的规模n,即辅助空间是O(1),则称之为就地排序(In-PlaceSou)。

        非就地排序一般要求的辅助空间为O(n)

        c、排序算法的时间开销

        大多数排序算法的时间开销主要是关键字之间的比较和记录的移动。有的排序算法其执行时间不仅依赖于问题的规模,还取决于输入实例中数据的状态。

     

  • 相关阅读:
    hdu acm 2844 Coins 解题报告
    hdu 1963 Investment 解题报告
    codeforces 454B. Little Pony and Sort by Shift 解题报告
    广大暑假训练1 E题 Paid Roads(poj 3411) 解题报告
    hdu acm 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活
    hdu acm 1114 Piggy-Bank 解题报告
    poj 2531 Network Saboteur 解题报告
    数据库范式
    ngnix 配置CI框架 与 CI的简单使用
    Vundle的安装
  • 原文地址:https://www.cnblogs.com/yedushusheng/p/5524133.html
Copyright © 2011-2022 走看看