排序(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、排序算法的时间开销

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

时间: 2024-10-12 14:38:30

排序(sort)的相关文章

详细解说 STL 排序(Sort)(转)

作者Winter 详细解说 STL 排序(Sort) 0 前言: STL,为什么你必须掌握 1 STL提供的Sort 算法 1.1 所有sort算法介绍 1.2 sort 中的比较函数 1.3 sort 的稳定性 1.4 全排序 1.5 局部排序 1.6 nth_element 指定元素排序 1.7 partition 和stable_partition 2 Sort 和容器 3 选择合适的排序函数 4 小结 5 参考文档 一切复杂的排序操作,都可以通过STL方便实现 ! 0 前言: STL,为

设计模式 - 模板方法模式(template method pattern) 排序(sort) 详解

模板方法模式(template method pattern) 排序(sort) 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考模板方法模式(template method pattern): http://blog.csdn.net/caroline_wendy/article/details/32159455 模板方法模式的一个主要的应用是排序(sort)算法. 对象的排列方式并不是完全相同, 所以需要排序(sort)算法compareTo()

JS数组去重,js中数组(Array)的排序(sort)

JS数组去重 var ddd = [1,2,4,5,2, 222,1,5,6]; var uq = {}; var rq = []; for(var i=0; i<9; i++){ if(!uq[ddd[i]]){ uq[ddd[i]] = true; rq.push(ddd[i]); } } return rq; js中数组(Array)的排序(sort)注意事项 var arrDemo = new Array(); arrDemo[0] = 10; arrDemo[1] = 50; arrD

详细解说 STL 排序(Sort)

http://www.cppblog.com/mzty/archive/2005/12/15/1770.html 详细解说 STL 排序(Sort) 0 前言: STL,为什么你必须掌握 1 STL提供的Sort 算法 1.1 所有sort算法介绍 1.2 sort 中的比较函数 1.3 sort 的稳定性 1.4 全排序 1.5 局部排序 1.6 nth_element 指定元素排序 1.7 partition 和stable_partition 2 Sort 和容器 3 选择合适的排序函数

设计模式 - 模板方法模式(template method pattern) 排序(sort) 具体解释

模板方法模式(template method pattern) 排序(sort) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考模板方法模式(template method pattern): http://blog.csdn.net/caroline_wendy/article/details/32159455 模板方法模式的一个基本的应用是排序(sort)算法. 对象的排列方式并非全然同样, 所以须要排序(sort)算法compareTo(

第五天 文件权限设置acl attr 文件内容排序sort uniq diff

linux root组 不是管理员角色 root组并不是有root权限 useradd -r -m r一般配合m使用 服务器让每个uid最好一样,统一标准化管理 token(uid ,gid,groups) file uid =read write 先看uid再看权限 想看到最新 file uid =read write excute必须重新登录 rwx二进制文件一般读取没有实际意义 ,不是随便一个权限赋予读都有意义读和写一般给文本文件,读权限对二进制文件不受影响 file r看文件内容 w修改

实战c++中的vector系列--使用sort算法对vector&lt;unique_ptr&lt;string&gt;&gt;进行排序(sort函数出错“应输入 2 个参数,却提供了 3 个)

之前博客写了对vector使用sort算法进行的排序,之前也写到过vector<unique_ptr<string>>的一些处理方法. 今天就写一下对vector<unique_ptr<string>>使用sort算法进行排序. #include<iostream> #include<string> #include<vector> #include<algorithm> #include<memory&

数组Array的排序sort

JavaScript中的Array对象有自己的排序方法sort(),对数组中的数据项进行排序,但是有时候排序结果不尽如人意,比如 var arr = [12, 1, 2, 21, 3]; arr.sort(); alert(arr); 得到的结果为  1,12,2,21,3 这是为什么呢?因为JavaScript中的排序默认按照ascii字符代码进行排序,也就是说,数字也是按照它们的字符串形式排序的. var strArr = ['a', '2', 'a2', '2a', 'b', '3'];

R排序sort、order、rank、arrange

? sort sort(x, decreasing = FALSE, ...) ## Default S3 method: sort(x, decreasing = FALSE, na.last = NA, ...) sort.int(x, partial = NULL, na.last = NA, decreasing = FALSE, method = c("shell", "quick"), index.return = FALSE) is.unsorted(

js 排序 SORT 各种方法

1.普通排序 <script> var array =[11,3,14,6,7,9]; array.sort(function(a,b){ return a-b; }); alert(array); </script> 2.排序json数组中对象的某个字段 <script> var array = [ {name: 'a', phone: "13", value: 'val_4'}, {name: 'b', phone: "5",