排序的概念

排序的一般定义:排序是计算机内经常进行的一种操作,其目的是将一组“无序”的数据元素调整为“有序”的数据元素。
例如:将下列关键字序列
52,49, 80, 36, 14, 58, 61, 23, 97, 75
调整为
14,23, 36, 49, 52, 58, 61 ,75, 80, 97

排序的数学定义:假设含n个数据元素的序列为{ R1, R2, …, Rn }其相应的关键字序列为{ K1, K2, …, Kn }这些关键字相互之间可以进行比较,即在它们之间存在着这样一个关系 :Kp1Kp2Kpn按此固有关系将上式记录序列重新排列为{ Rp1, Rp2, …Rpn }的操作称作排序。

排序的示例


到这里,可能有人发现了问题,按总评排序后为什么张无忌的排名比郭靖靠前呢?这就涉及排序的稳定性范畴了。

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

上例中稳定的排序应该如下图:

上面我们一直在强调关键字,有时候我们需要排序的数列关键字不止一个,怎么办呢?这就要说一下多关键字排序了。

多关键字排序

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

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

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

多关键字排序的示例:

既然是多关键字排序,那么就会有一个问题:多关键字排序算法是否比单关键字排序算法更复杂?

要回答这个问题呢,首先要了解一下排序的关键操作,比较和交换。

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

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

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

我们就用一个小例子来看一下

#include <stdio.h>// 定义结构体
typedef struct _tag_DataElem
{char desc[20];          // 比较关键字描述int key1;               // 关键字1int key2;               // 关键字2
} DataElem;// 比较算法1
int compare1(DataElem* ld, DataElem* rd)
{int ret = 0;// 比较元素1关键字1大于比较元素2关键字1,返回1if( ld->key1 > rd->key1 ){ret = 1;}// 比较元素1关键字1等于比较元素2关键字1,比较关键字2else if( ld->key1 == rd->key1 ){          // 比较元素1关键字2大于比较元素2关键字2,返回1if( ld->key2 > rd->key2 ){ret = 1;}// 比较元素1关键字2小于比较元素2关键字2,返回-1if( ld->key2 < rd->key2 ){ret = -1;}}// 比较元素1关键字1小于比较元素2关键字1,返回-1else{ret = -1;}return ret;
}// 比较算法2
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;
}

从上述代码中我们发现,算法1比较中规中矩,算法2运用了一个小技巧,因为比较的是两位数,所以将2个两位数关键字组合成一个4位数的关键字,然后再比较。我们不考虑编程的技巧,单从时间复杂度来看,他们都是O(1),所以多关键字比较的算法并不一定比单个关键字比较的算法复杂。

排序的分类

由于待排序的记录数量不同,使得排序过程中涉及的存储器不同,所以可将排序方法按存储方式分为内部排序外部排序

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

既然是排序,那么每一个排序算法都会有优劣。如何进行审判呢?

排序的审判:

1.时间性能:关键性能差异体现在比较和交换的数量;

2.辅助存储空间:为完成排序操作需要的额外的存储空间,必要时可以空间换时间

3.算法的实现复杂性:过于复杂的排序法会影响代码的可读性和可维护性,也可能影响排序的性能。

数据结构之排序的概念及分类相关推荐

  1. 《大话数据结构》第9章 排序 9.2 排序的基本概念与分类

    9.2 排序的基本概念与分类 9.2.1 排序的定义         排序是我们生活中经常会面对的问题.同学们做操时会按照从矮到高排列:老师查看上课出勤情况时,会按学生学号顺序点名:高考录取时,会按成 ...

  2. 排序(基本概念及分类,直接插入排序和希尔排序)

    排序的概念 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作. 稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对 ...

  3. 数据结构——八大排序(全)

    目录 排序的基本概念和分类 排序算法的稳定性 内排序和外排序 1. 时间性能 2.辅助空间 3.算法的复杂性 4.排序用到的结构体和函数 冒泡排序 排序原理 代码 代码1 代码2(正宗的冒泡排序) 代 ...

  4. 18 操作系统第五章 设备管理 IO设备的基本概念和分类 IO控制器 IO控制方式 IO软件层次结构 IO核心子系统 假脱机技术 设备的分配与回收 缓冲区管理

    文章目录 1 IO设备的基本概念和分类 1.1 什么是I/O设备 1.2 I/O设备分类 2 IO控制器 2.1 I/O设备组成 2.2 I/O控制器功能 2.3 I/O控制器的组成 2.4 寄存器编 ...

  5. 【数据结构(C语言)】数据结构-内部排序

    内部排序 文章目录 内部排序 一.概述 (1)排序定义 (2)稳定性 (3)内部排序和外部排序 (4)两种基本操作 (5)数据类型定义 二.分类 (1)插入排序 (2)交换排序 (3)选择排序 (4) ...

  6. 【图解数据结构】排序全面总结(一)

    目录 一.前言 学习目标: 二.基本概念 1.排序 2.排序方法的稳定性 3.内部和外部排序 三.插入类排序 1.直接插入排序 2.折半插入排序 3.希尔排序 四.交换类排序 1.冒泡排序 2.快速排 ...

  7. 软件测试概念及分类整理汇总

    转载自博主Findyou 原文链接https://www.cnblogs.com/findyou/p/6480411.html 软件测试概念及分类整理汇总 前言 测试小伙伴在谈论软件测试分类,五花八门 ...

  8. 【数据结构】——排序算法——2.1、冒泡排序

                                                        [数据结构]--排序算法--2.1.冒泡排序 一.先上维基的图:   图一.冒泡排序 分类 排序 ...

  9. 【数据结构】二叉树的概念及结构

    提示:学习此篇博客之前,可以先学习[数据结构]树的概念及结构. 文章目录 前言 1.二叉树的概念 2.特殊的二叉树 3.二叉树的性质 4.二叉树的存储结构 前言 普通二叉树,很难构成现实的应用场景,但 ...

最新文章

  1. 【SSM框架系列】SpringMVC的请求和响应
  2. 8086汇编复习3 - 标志寄存器 - 使用emu8086
  3. Spark创建RDD的四种方式(一):从集合(内存)中创建 RDD代码示例
  4. 利用Sigar获取系统信息
  5. 10G整数文件中寻找中位数或者第K大数
  6. 产品研发过程管理专题——基于产品的测试管理(用友软件测试流程初探)
  7. Java基础知识2(字符串)
  8. 说说id获取器手机版_怎么提取自己空间说说的ID
  9. java接口自动化测试框架搭建
  10. android定位和地图开发实例
  11. 显著性检验:P值和置信度
  12. 如何有效规避程序化交易的滑点?
  13. Android 系统服务
  14. esp01s改造老旧吸尘器连入天猫精灵语音控制(blinker + 阿里云)
  15. 业余选手击打高远球的三个错误
  16. Object中的同步机制[转]
  17. xmpp学习使用简单介绍(二)
  18. 安卓APP在运行时对全局进行网络状态监听的实现
  19. 如何使用Node.js来制作电子音乐-编写我们的旋律
  20. Excel怎么将表格中的所有空白行删除

热门文章

  1. c++ string 回文串_第33期:上海自来水来自海上,回文字符串验证!
  2. 解决django前端使用iframe标签报错127.0.0.1 refused to connect.
  3. python复现感知机的二分类算法
  4. python pyautogui_python模块------pyautogui
  5. ubuntu命令 图片 壁纸_太简单了!1分钟把Win 10 高颜值的开屏锁屏壁纸存储到电脑!...
  6. 往hbase插入数据,你会选择哪种?
  7. vue-router组件重用 路由切换时的问题
  8. VerbalExpressions
  9. HDU1233——还是通常工程(最小生成树,并查集)
  10. Hibernate学习笔记--映射配置文件详解