数学排序

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
将无序子序列中的一个或几 个记录“插入”到有序序列中, 从而增加记录的有序子序列的长 度。
2. 交换类
通过“交换”无序序列中的记 录从而得到其中关键字最小或最大 的记录,并将它加入到有序子序列 中,以此方法增加记录的有序子序 列的长度。
3. 选择类
从记录的无序子序列中“选择” 关键字最小或最大的记录,并将它 加入到有序子序列中,以此方法增 加记录的有序子序列的长度。
第十章 内部排序
10.1 概述 10.2 插入排序
10.2.1 直接插入排序、折半插入排序、表插入排序 10.2.3 shell排序 10.3 交换排序(快速排序) 10.4 选择排序 10.4.1 简单选择排序 10.4.3 堆排序 10.5 归并排序 10.6 基数排序 10.7 各种排序方法的比较讨论 外部排序
4. 归并类
通过“归并”两个或两个以上的 记录有序子序列,逐步增加记录有 序序列的长度。
5. 其它方法
排序的基本操作和记录的存储方式
排序过程中需要的两种基本操作: • (1)比较关键字的大小; • (2)将记录从一个位置移至另一个位置。
待排序记录序列可有下列三种存储方式: (1)记录存放在一组连续的存储单元中;类似于线性表
外部排序
待排序记录的数量很大,以致内存一次不能容纳全 部记录,在排序过程中尚需对外存进行访问的排 序。
一般情况下, 假设含n个记录的序列为{ R1, R2, …, Rn } 其相应的关键字序列为 { K1, K2, …,Kn }
需确定1,2,…,n的一种排列p1,p2,…,pn,在相 应关键字之间存在着这样一个关系 :
基于不同的“扩大” 有序序列长度的方 法,内部排序方法大致可分下列几种类型:
插入类 交换类 选择类 归并类 基数类
按工作量分类,可以分为三类: •(1)简单的排序方法,其时间复杂度为O(n2) •(2)先进的排序方法,其时间复杂度为O(nlog2n) •(3)基数排序,其时间复杂度为O(d.n)
1. 插入类
设待排记录的数据类型定义如下:
#define MAXSIZE 100 // 待排顺序表最大长度
typedef int KeyType; // 关键字类型为整数类型
typedef struct {
KeyType key;
// 关键字项
InfoType otherinfo; // 其它数据项
} RedType; typedef struct {
实现“一趟插入排序”可分三步进行:
1.在R[1..i-1]中查找R[i]的插入位置,
R[1..j].key R[i].key < R[j+1..i-1].key;
2.将R[j+1..i-1]中的所有记录均后移
一个位置;
3.将R[i] 插入(复制)到R[j+1]的位置上。
不同的具体实现方法导致不同的算法描述
// 记录类型
RedType r[MAXSIZE+1]; // r[0]闲置
int
length;
// 顺序表长度
} SqList;
// 顺序表类型
9. 2 插入排序
一趟直接插入排序的基本思想:
有序序列R[1..i-1]
无序序列 R[i..n]
R[i]
有序序列R[1..i]
无序序列 R[i+1..n]
R[0]
R[i]
j
j= i-1 插入位置
上述循环结束后可以直接进行“插入”
令 i = 2,3,…, n, 实现整个序列的排序。 for ( i=2; i<=n; ++i ) if (R[i].key<R[i-1].key)
{ 在 R[1..i-1]中查找R[i]的插入位置; 插入R[i] ;
}ຫໍສະໝຸດ Baidu
直接插入排序举例
例:序列为{49,38,65,97,76,13,27,49} {(49),38,65,97,76,13,27,49}
(38) {(38,49),65,97,76,13,27,49} (65) {(38,49,65),97,76,13,27,49} (97) {(38,49,65,97),76,13,27,49} (76) {(38,49,65,76,97),13,27,49} (13) {(13,38,49,65,76,97),27,49} (27) {(13,27,38,49,65,76,97),49} (49) {(13,27,38,49,49,65,76,97)}
Kp1≤Kp2≤…≤Kpn
按此固有关系将上式记录序列重新排列为 { Rp1, Rp2, …,Rpn }
的操作称作排序。
排序的分类
内部排序的过程是一个逐步扩大 记录的有序序列长度的过程。
有序序列区 无 序 序 列 区
经过一趟排序
有序序列区 无 序 序 列 区
排序的两个基本操作:按关键字比较,元素移动
R[0] = R[i];
// 设置“哨兵”
for (j=i-1; R[0].key<R[j].key; --j); // 从后往前找
循环结束表明R[i]的插入位置为 j +1
对于在查找过程中找到的那些关键 字不小于R[i].key的记录,在查找的同 时实现记录向后移动;
for (j=i-1; R[0].key<R[j].key; --j) R[j+1] = R[j];
直接插入排序(基于顺序查找) 折半插入排序(基于折半查找) 表插入排序(基于链表存储) 希尔排序(基于逐趟缩小增量)
一、直接插入排序
利用 “顺序查找”实现
“在R[1..i-1]中查找R[i]的插入位置”
算法的实现要点:
从R[i-1]起向前进行顺序查找,
监视哨设置在R[0];
R[0]
R[i]
j 插入j=位i-置1
10.1 内部排序概述
排序(Sorting):
将数据元素(或记录)的一个任意序列,重新排列成 一个按关键字有序的序列。
排序方法的稳定性:
对关键字相同的数据元素,排序前后它们的领先关 系保持不变,则称该排序方法是稳定的。反之, 称该排序方法是不稳定的。
内部排序
待排序记录存放在计算机的内存中进行排序。
的顺序存储结构,记录次序由存储位置决定,实现排 序需移动记录。---顺序排序 (2)记录存放在静态链表中;记录次序由指针指示,实 现排序不需移动记录,仅需修改指针。--- 链排序 (3)记录本身存放在一组连续的存储单元中,同时另设 指示各个记录存储位置的地址向量,排序过程中不移 动记录本身,而移动地址向量中相应记录的地址。排 序结束后再根据地址调整记录的存储位置。--- 地址排
相关文档
最新文档