目录

一、什么是内排序?什么是外排序?

二、内排序详细介绍

1. 定义

2、排序分类&稳定性

3、内排序的方法

4、排序算法的性能评价

5、待排序记录的类描述

6、算法:顺序表插入


前言

排序是计算机程序设计中的一种重要操作,其功能是对一个数据元素集合或序列重新排列成一个按数据元素某个相知有序的序列。排序分为两类:内排序和外排序。

一、什么是内排序?什么是外排序?

内排序:全称为内部排序。内部排序是指待排序列数据记录完全存放在内存中所进行的排序过程,适合不太大的元素序列。

外部排序:是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中还需要访问外部存储器的排序。

我们通常所说的排序算法往往指的是内部排序算法,即数据记录在内存中进行排序。

内部排序方法:
  1.插入排序(直接插入排序);
  2.快速排序;
  3.选择排序(简单选择排序);
  4.归并排序;
  5.冒泡排序;
  6.希尔排序;
  希尔排序是对直接插入排序方法的改进。
  7.堆排序;

二、内排序详细介绍

1. 定义

  • 排序:将一组无序的记录序列调整为有序的记录序列的一种操作。

  • 排序的目的:提高查询的效率。

  • 相关名词:

    1.关键字:数据元素(或记录)中某个数据项,用于标识该数据元素(或记录)。作为排序依据的数据项。

    2.主关键字:能够唯一标识一条记录的数据项。

    3.次关键字:能表示多条记录的数据项。

  • 排序稳定性:

    • 相同的关键字(52、52),通过排序算法排序后,顺序是否相同

      1.如果相同(52、52),算法是稳定算法

      2.如果不同(52、52),算法是不稳定算法。

  • 约定:

    1.排序:按关键字非递增(从小到大)排序

    2.存储:以顺序表作为排序表的存储结构

    3.类型:关键字类型为整形

2、排序分类&稳定性

  • 按照存储器不同分为:外部排序、内部排序

    • 内部排序:所有数据都在内存中进行的排序。适合数据量小的数据元素的排序。

    • 外部排序:排序过程中,需要访问外部存储器的排序。待排序的数据元素非常多必须存储在外部存储器上。

  • 按照相同关键字排序前后的位置分为:稳定排序、不稳定排序。例如:{3,4,2,==3==,1}

    • 稳定排序:相同关键字间的前后位置关系在排序前和排序后保持一致。例如:{1,2,3,==3==,4}

    • 不稳定排序:保持不一致。例如:{1,2,==3==,3,4}

3、内排序的方法

  • 内部排序:一个逐渐扩大记录的有序序列长度的过程。

类型 描述
插入类 将无序子序列中的一个或几个记录插入到有序序列中,从而增加记录的有序子序列的长度。
交换类 通过交换无序序列中的记录,从而得到其中关键字最小或最大的记录,并将它加入到有序 子序列中,以此方法增加记录的有序子序列的长度。
选择类 从记录的无序子序列中选择关键字最小或最大的记录,并将它加入到有序子序列中, 以此方法增加记录的有序子序列的长度。
归并类 通过归并两个或两个以上的记录有序子序列,逐渐增加记录有序序列的长度。

4、排序算法的性能评价

  • 排序算法好坏的标准:算法的时间复杂度、算法的空间复杂度

  • 排序是一个经常使用的运算,所需时间是衡量排序算法好坏的重要标志。

  • 排序的时间开销,可以通过算法执行过程中的记录比较次数移动次数来衡量。

5、待排序记录的类描述

  • 实现内部排序的==基本操作==有两个:

    1. “比较”序列中两个关键字的大小

    2. “移动”记录

  • 顺序表记录结点类:

/*** 顺序表记录结点类*/
public class RecordNode {public Comparable key; // 关键字public Object element; // 数据元素public RecordNode() {}public RecordNode(Comparable key) { // 构造方法1this.key = key;}public RecordNode(Comparable key, Object element) { // 构造方法2this.key = key;this.element = element;}public String toString() { // 覆盖toString()方法return "[" + key + "," + element + "]";}
}
  • 带排序的顺序表类描述:
public class SeqList {public RecordNode[] r;    //顺序表记录结点数组public int curlen;        //顺序表长度,即记录个数// 顺序表的构造方法,构造一个存储空间容量为maxSize的顺序表public SeqList(int maxSize) {this.r = new RecordNode[maxSize];  // 为顺序表分配maxSize个存储单元this.curlen = 0;                   // 置顺序表的当前长度为0}public void display() {    //输出数组元素for (int i = 0; i < this.curlen; i++) {// 如果是个位数,多输出一个空格String str = r[i].key.toString().length() == 1 ? "  " : " ";System.out.print(str + r[i].key.toString());}System.out.println();}public void display(int sortMode) {    //输出数组元素int i;if(sortMode==9)   //带监视哨的直接插入排序方法,0号单元用于存放监视哨i=1;elsei=0;for (; i < this.curlen; i++) {String str = r[i].key.toString().length() == 1 ? "  " : " ";System.out.print(str + r[i].key.toString());}System.out.println();}}

6、算法:顺序表插入

1、步骤:

  • 在当前顺序表的第i个结点之前插入一个RecordNode类型的结点x

  • 其中i取值范围为:0≤i≤length()。

  • 如果i值不在此范围则抛出异常,当i=0时表示在表头插入一个数据元素x,

  • 当i=length()时表示在表尾插入一个数据元素x

2、代码:

public void insert(int i, RecordNode x) throws Exception {if (curlen == r.length) {    // 判断顺序表是否已满throw new Exception("顺序表已满");}if (i < 0 || i > curlen) {  // i小于0或者大于表长throw new Exception("插入位置不合理");}for (int j = curlen; j > i; j--) {r[j] = r[j - 1];   // 插入位置及之后的元素后移}r[i] = x;   // 插入xthis.curlen++;  // 表长度增1}

【数据结构】什么是内排序、外排序?内排序详细介绍相关推荐

  1. [转]详细介绍java中的数据结构

    详细介绍java中的数据结构 本文介绍的是java中的数据结构,本文试图通过简单的描述,向读者阐述各个类的作用以及如何正确使用这些类.一起来看本文吧! 也许你已经熟练使用了java.util包里面的各 ...

  2. python链表详细教程_详细介绍python数据结构之链表

    这篇文章主要为大家详细介绍了python数据结构之链表的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 数据结构是计算机科学必须掌握的一门学问,之前很多的教材都是用C语言实现链表,因为c有 ...

  3. 数据结构 图的详细介绍

    图的详细介绍 1.名词解释: 图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合.在图中的数据元素,我 ...

  4. C++11 unordered_map详细介绍

    整理的算法模板合集: ACM模板 目录: 1.介绍 1.1 特性 2. 模版 2.1 迭代器 3. 功能函数 3.1 构造函数 3.2 容量操作 3.2.1 size 3.2.2 empty 3.3 ...

  5. 红黑树(一)之 原理和算法详细介绍---转帖

    目录 1 红黑树的介绍 2 红黑树的应用 3 红黑树的时间复杂度和相关证明 4 红黑树的基本操作(一) 左旋和右旋 5 红黑树的基本操作(二) 添加 6 红黑树的基本操作(三) 删除 作者:Sky W ...

  6. Linux小工具(3)之/proc目录详细介绍(上)

    目录 前言 一.平台说明 二./proc目录概述 三.准备使用 (1)进程描述文件夹 (2)/proc目录下常见的文件夹 前言 Linux系统的使用有别于Windows系统,无论是系统信息还是应用软件 ...

  7. 红黑树(一)之 原理和算法详细介绍

    出处:http://www.cnblogs.com/skywang12345/p/3245399.html 概要 目录 1 红黑树的介绍 2 红黑树的应用 3 红黑树的时间复杂度和相关证明 4 红黑树 ...

  8. Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例

    转载自  Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例 第1部分 ArrayList介绍 ArrayList简介 ArrayList 是一个数组队列,相当于 动态数组.与 ...

  9. Ubuntu根目录下各文件夹的功能详细介绍

    Ubuntu的根目录下存在着很多的文件夹,但你知道他们都存放着哪些文件呢?这些是深入了解Ubuntu系统必不缺少的知识,本文就关于此做一下介绍吧. /bin/    用以存储二进制可执行命令文件. / ...

最新文章

  1. JMC | 药物发现中的迁移学习
  2. pandas dataframe bool索引的使用
  3. ICLR2018论文投稿抢先看:Ian Goodfellow由衷赞赏的训练稳定方法SN-GANs
  4. solidity智能合约开发简介
  5. CentOS7内核升级
  6. 第十二章 支持向量机-机器学习老师板书-斯坦福吴恩达教授
  7. SharpDevelop源码分析 (一、序+基本概念) 收藏
  8. 北风设计模式课程---里氏替换原则(Liskov Substitution Principle)
  9. [蓝桥杯][2013年第四届真题]危险系数(暴力+dfs)
  10. c开头英文语言,C开头的考研英语词汇
  11. EXCHANGE RBAC(基于角色的访问控制)管理工具
  12. OpenCV 基本模块
  13. 图片转换成base64编码格式展示
  14. 数学建模之秩和比综合评价方法(RSR)
  15. 设计模式之--生成器模式与抽象工厂模式的比较
  16. i12蓝牙耳机怎么设置成中文_耳朵里的小精灵——乐迈车载智能蓝牙耳机
  17. np.percentile()函数
  18. PHP如何在照片下面写一行字_怎样在手机照片下方留白加文字?
  19. labview与PLC通讯
  20. Cyclostationary Signal 循环平稳信号概念辨析

热门文章

  1. 基于hml+css+js的的网页设计-茶文化
  2. 计算机毕业设计Javavue平顶山香山寺网站(源码+系统+mysql数据库+lw文档)
  3. 解决办法 fonts/fontawesome-webfont.woff2 404 (Not Found)
  4. pc端vue登录如何调用软键盘_vue-自定义pc端软键盘
  5. 计算机发展的三大定律,计算机体系结构发展的四个时代介绍
  6. 对 IID 为“{00020970-0000-0000-C000-000000000046}”的接口的 COM 组件调用 QueryInterface 因以下错误而失败: 加载类型库/DLL 时出错
  7. (17)ObjectARX2015 + vs2012创建块定义
  8. 前端--jsp、js--返回上一个页面的方法(非脚本返回)
  9. C++ 中的 static 关键字
  10. Python 爬取淘宝商品的价格并保存到本地excel文件中