数据结构-排序PPT课件
合集下载
严蔚敏数据结构(排序)ppt课件
❖基本思想:通过一趟排序,将待排 序记录分割成独立的两部分,其中 一部分记录的关键字均比另一部分 记录的关键字小,则可分别对这两 部分记录进行排序,以达到整个序 列有序
❖排序过程:对r[s……t]中记录进行一趟
快速排序,附设两个指针i和j,设枢轴记录 rp=r[s],x=rp.key
初始时令i=s,j=t
一趟排序:13 27 48 55 4 49 38 65 97 76 取d2=3 二趟分组:13 27 48 55 4 49 38 65 97 76
二趟排序:13 4 48 38 27 49 55 65 97 76 取d3=1 三趟分组:13 4 48 38 27 49 55 65 97 76
三趟排序:4 13 27 38 48 49 55 65 76 97
i=8 20 (6
i=8 20 (6
13 30 39 42 70 85 ) 20
13 30 39 m
13 30 39 mj 13 30 39
s mj
42 70 42 70 42 70
85 ) 20 j 85 ) 20
85 ) 20
13 30 39 42 70 85 ) 20 js
13 20 30 39 42 70 85 )
第九章 内部排序
• 分类:
•内部排序:全部记录都可以同时调入内存进行的排序。
•外部排序:文件中的记录太大,无法全部将其同时调入内存进行的排 序。
• 定义:设有记录序列:{ R1、R2 ……….. Rn } 其相应的关键字 序列为: { K1、K2 ……….. Kn }; 若存在一种确定的关系: Kx <= Ky <= … <= Kz则将记录序列 { R1、R2 ……….. Rn } 排成按 该关键字有序的序列: { Rx、Ry ……….. Rz } 的操作,称之为 排序。
❖排序过程:对r[s……t]中记录进行一趟
快速排序,附设两个指针i和j,设枢轴记录 rp=r[s],x=rp.key
初始时令i=s,j=t
一趟排序:13 27 48 55 4 49 38 65 97 76 取d2=3 二趟分组:13 27 48 55 4 49 38 65 97 76
二趟排序:13 4 48 38 27 49 55 65 97 76 取d3=1 三趟分组:13 4 48 38 27 49 55 65 97 76
三趟排序:4 13 27 38 48 49 55 65 76 97
i=8 20 (6
i=8 20 (6
13 30 39 42 70 85 ) 20
13 30 39 m
13 30 39 mj 13 30 39
s mj
42 70 42 70 42 70
85 ) 20 j 85 ) 20
85 ) 20
13 30 39 42 70 85 ) 20 js
13 20 30 39 42 70 85 )
第九章 内部排序
• 分类:
•内部排序:全部记录都可以同时调入内存进行的排序。
•外部排序:文件中的记录太大,无法全部将其同时调入内存进行的排 序。
• 定义:设有记录序列:{ R1、R2 ……….. Rn } 其相应的关键字 序列为: { K1、K2 ……….. Kn }; 若存在一种确定的关系: Kx <= Ky <= … <= Kz则将记录序列 { R1、R2 ……….. Rn } 排成按 该关键字有序的序列: { Rx、Ry ……….. Rz } 的操作,称之为 排序。
严蔚敏数据结构(排序)ppt课件
T(n)=O(n²)
空间杂度:S(n)=O(1)
折半插入排序 ❖排序过程:用折半查找方法确定插入位置的排序叫~
例 i=1
(30) 13 70 85 39 42 6 20
i=2 13 (13 30) 70 85 39 42 6 20
…...
i=7 6 (6 i=8 20 (6
s i=8 20 (6
s i=8 20 (6
若待排序记录按关键字从大到小排列(逆序)
关键字比较次数:
n i (n2)(n1)
i2
2
记录移动次数:
n
(n4)(n1)
(i1)
i2
2
0 1 2 34 5 6 7 97 76 65 49 38 27 13
若待排序记录是随机的,取平均值 关键字比较次数: n 2
4
记录移动次数:
n2 4
关键字较小的记录跳跃式前移,在进行 最后一趟增量为1的插入排序时,序列已 基本有序
增量序列取法
没有除1以外的公因子
最后一个增量值必须为1
9.2 快速排序
冒泡排序
❖排序过程
将第一个记录的关键字与第二个记录的关键字进行 比较,若为逆序r[1].key>r[2].key,则交换;然后 比较第二个记录与第三个记录;依次类推,直至第 n-1个记录和第n个记录比较为止——第一趟冒泡排 序,结果关键字最大的记录被安置在最后一个记录 上
❖算法描述
❖算法评价 时间复杂度:T(n)=O(n²) 空间复杂度:S(n)=O(1)
希尔排序(缩小增量法)
❖排序过程:先取一个正整数d1<n, 把所有相隔d1的记录放一组,组内 进行直接插入排序;然后取d2<d1, 重复上述分组和排序操作;直至 di=1,即所有记录放进一个组中排 序为止
《数据结构排序》课件
根据实际需求选择时间复杂度和空间 复杂度最优的排序算法,例如快速排 序在平均情况下具有较好的性能,但 最坏情况下其时间复杂度为O(n^2)。
排序算法的适用场景问题
适用场景考虑因素
选择排序算法时需要考虑实际应 用场景的特点,如数据量大小、 数据类型、是否需要稳定排序等 因素。
不同场景适用不同
算法
例如,对于小规模数据,插入排 序可能更合适;对于大规模数据 ,快速排序或归并排序可能更优 。
排序的算法复杂度
时间复杂度
衡量排序算法执行时间随数据量增长而增长的速率。时间复杂度越低,算法效 率越高。常见的时间复杂度有O(n^2)、O(nlogn)、O(n)等。
空间复杂度
衡量排序算法所需额外空间的大小。空间复杂度越低,算法所需额外空间越少 。常见的空间复杂度有O(1)、O(logn)、O(n)等。
在数据库查询中,经常需要对结果进行排序,以便用户能够快速找到所需信息。排序算 法的效率直接影响到查询的响应时间。
索引与排序
数据库索引能够提高查询效率,但同时也需要考虑到排序的需求。合理地设计索引结构 ,可以加速排序操作。
搜索引擎中的排序
相关性排序
搜索引擎的核心功能是根据用户输入的 关键词,返回最相关的网页。排序算法 需要综合考虑网页内容、关键词密度、 链接关系等因素。
VS
广告与排序
搜索引擎中的广告通常会根据关键词的竞 价和相关性进行排序,以达到最佳的广告 效果。
程序中的排序应用
数组排序
在程序中处理数组时,经常需要对其进行排 序。不同的排序算法适用于不同类型的数据 和场景,如快速排序、归并排序等。
数据可视化中的排序
在数据可视化中,需要对数据进行排序以生 成图表。例如,柱状图、饼图等都需要对数 据进行排序处理。
《数据结构》排序》课件
遍历数组,两两比较并交换元素位
置,重复执行直到排序完成。
3
时间复杂度分析
最好情况下O(n),最坏情况和平均
优化方法
4
情况下为O(n^2)。
加入标记位,如果某次遍历中没有 发生交换,则表示已排序完成。
插入排序
基本思想
将数组分为已排序 和未排序两部分, 每次从未排序中取 出一个元素插入到 已排序的合适位置。
感谢阅读。
的元素,放到已排序的末尾。
每次遍历未排序部分,找到最小
(或最大)的元素,放到已排序部
分末尾。
3
堆排序
使用堆数据结构进行排序,每次选
取堆顶元素,调整堆结构,重复执
时间复杂度分析
4
行直到排序完成。
最坏情况下为O(n^2),平均情况下
为O(n^2)。
5
优化方法
使用堆排序技巧,优化选择的效率。
快速排序
1
实现流程
时间复杂度
不同排序算法的时间复 杂度对比。
空间复杂度
不同排序算法的空间复 杂度对比。
稳定性
不同排序算法在相同元 素排序时的稳定性对比。
结语
通过本课件,您了解了不同排序算法的原理、实现和优化。在实际应用中, 选择合适的排序算法非常重要。希望本课件能为您的学习和实践提供有价值 的指导。
让我们继续深入学习!
直接插入排 序
逐个遍历未排序元 素,依次插入到已 排序序列中正确的 位置。
希尔排序
将数组按一定步长 分组,分组内使用 直接插入排序,不 断缩小步长直到为 1。
时间n^1.3)。
选择排序
1
基本思想
每次从未排序中选择最小(或最大)
直接选择排序
数据结构-排序PPT课件
平均情况时间复杂度
O(nlogn),归并排序的平均时间复杂度为O(nlogn)。其中,n为待排序序列的长度。
06
基数排序
基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。
分配和收集
基数排序是一种稳定的排序算法,即相同的元素在排序后仍保持原有的顺序。
文件系统需要对文件和目录进行排序,以便用户可以更方便地浏览和管理文件。
数据挖掘和分析中需要对数据进行排序,以便发现数据中的模式和趋势。
计算机图形学中需要对图形数据进行排序,以便进行高效的渲染和操作。
数据库系统
文件系统
数据挖掘和分析
计算机图形学
02
插入排序
将待排序的元素按其排序码的大小,逐个插入到已经排好序的有序序列中,直到所有元素插入完毕。
简单选择排序
基本思想:将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列了。 时间复杂度:堆排序的时间复杂度为O(nlogn),其中n为待排序元素的个数。 稳定性:堆排序是不稳定的排序算法。 优点:堆排序在最坏的情况下也能保证时间复杂度为O(nlogn),并且其空间复杂度为O(1),是一种效率较高的排序算法。
基数排序的实现过程
空间复杂度
基数排序的空间复杂度为O(n+k),其中n为待排序数组的长度,k为计数数组的长度。
时间复杂度
基数排序的时间复杂度为O(d(n+k)),其中d为最大位数,n为待排序数组的长度,k为计数数组的长度。
适用场景
当待排序数组的元素位数较少且范围较小时,基数排序具有较高的效率。然而,当元素位数较多或范围较大时,基数排序可能不是最优选择。
O(nlogn),归并排序的平均时间复杂度为O(nlogn)。其中,n为待排序序列的长度。
06
基数排序
基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。
分配和收集
基数排序是一种稳定的排序算法,即相同的元素在排序后仍保持原有的顺序。
文件系统需要对文件和目录进行排序,以便用户可以更方便地浏览和管理文件。
数据挖掘和分析中需要对数据进行排序,以便发现数据中的模式和趋势。
计算机图形学中需要对图形数据进行排序,以便进行高效的渲染和操作。
数据库系统
文件系统
数据挖掘和分析
计算机图形学
02
插入排序
将待排序的元素按其排序码的大小,逐个插入到已经排好序的有序序列中,直到所有元素插入完毕。
简单选择排序
基本思想:将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列了。 时间复杂度:堆排序的时间复杂度为O(nlogn),其中n为待排序元素的个数。 稳定性:堆排序是不稳定的排序算法。 优点:堆排序在最坏的情况下也能保证时间复杂度为O(nlogn),并且其空间复杂度为O(1),是一种效率较高的排序算法。
基数排序的实现过程
空间复杂度
基数排序的空间复杂度为O(n+k),其中n为待排序数组的长度,k为计数数组的长度。
时间复杂度
基数排序的时间复杂度为O(d(n+k)),其中d为最大位数,n为待排序数组的长度,k为计数数组的长度。
适用场景
当待排序数组的元素位数较少且范围较小时,基数排序具有较高的效率。然而,当元素位数较多或范围较大时,基数排序可能不是最优选择。
《数据结构》排序》PPT课件.ppt
结束
结束
[50 65] 76 [97]
50 [65]
结束
结束
[13 38 38 49 50 65 76 97]
(b) 快速排序的全过程
图9.4 快速排序示例
算法9.4 快速排序算法。
void Quick_Sort(NODE array[],int start,int end)
/* 对从array[start]到array[end]的记录快速排序 */
}
}
9.1.2 希尔排序
希尔排序是一种步长递减的插入排序,又称为
“缩小增量排序”。该排序方法是,将直接插入分成插入 步长由大到小不同的若干趟来进行。初始,步长较大,相 当于把待排记录序列分成若干子序列,各子序列中记录的 间隔为步长距离,由于子序列的长度小,所以子序列的插 入排序的效率较高。以后各趟逐步减小步长,随着步长的 减小,子序列的长度在增加,但子序列中包含了上一趟经 过大的步长插入排序的结点,因此,已有部分结点有序, 这样,在排序中记录移动的次数就少,排序的效率也就高。 最后一趟是步长为1,即:对整个序列直接插入排序,但 这时整个序列已基本有序,只要做少量记录移动,就可将 该序列排成有序。
问题,但它的排序速度要比直接插 入排序快,另外,它是一种不稳定 排序
9.2 交换排序
交换排序基本思想:比较二个待排序记录的关键字, 若为逆序,则交换位置,反之,保持原序。
9.2.1 冒泡(简单交换排序)
冒泡排序的方法是:首先比较array[n-1].key和array[n-2]. key,若为逆序则交换之,然后比较array[n-2].key和array[n3].key,依此类推,直到比较array[1].key和array[0].key,称为 一趟“冒泡”,其结果是将具有最小关键字的记录排到序列 的第1个位置上。然后再array[n-1]到array[1]之间进行一趟“ 冒泡”,将具有次小关键字的记录排到序列的第2个位置上。 依此类推,直到第n-1趟,在array[n-1]和array[n-2]之间进行“ 冒泡”后,待排序序列已排成有序。
数据结构课件-排序
不稳定
2021/8/5
12
三、选择排序(Selection Sort)
基本思想:每一趟在待排序的记录中选出关键 字最小的记录,依次放在已排序的记录序列的最后, 直至全部记录排完为止。
2021/8/5
13
1. 简单选择排序
第一趟排序:在无序区R[1]~R[n]中选出关 键字最小的记录,将它与R[1]交换;
[13 27 38] 97 76 49 65 49‘
[13 27 38 49] 76 97 65 49‘
[13 27 38 49 49‘] 97 65 76
[13 27 38 49 49‘ 65] 97 76
[13 27 38 49 49‘ 65 76] 97
[13 27 2021/8/5 38 49 49‘ 65 76 97]
注:简单的排序方法,时间复杂度O(n2); 先进的排序方 法,时间复杂度O(nlogn);基数排序,时间复杂度O(d·n)。
2021/8/5
2
以数组作为文件的存储结构
#define MAXSIZE 100
typedef struct
{
KeyType key;
InfoType otherinfo;
}RecType;
11 02 47‘ 33 25 47 57 61 82 72
02 11 25 33 47‘ 47 57 61 72 82 d=1
2021/8/5
8
记录分组: 某一趟希尔排序的增量为d,文件分为d组:
(R1,Rd+1,R2d+1,…), (R2,Rd+2,R2d+2,…), …, (Rd,R2d,R3d,…)
[11] 11 33 47 61 72 82 25 47‘ //结束11的插入排序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3.排序算法的好坏如何衡量?
• 时间效率——排序速度(即排序所花费的全部比较次数) • 空间效率——占内存辅助空间的大小 • 稳定性——若两个记录A和B的关键字值相等,但排序后A、
B的先后次序保持不变,则称这种排序算法是稳定的。
二、内部排序和外部排序
若待排序记录都在内存中,整个排序 过程不需要访问外存便能完成,则称此 类排序问题为内部排序;
第10章序 10.3 快速排序 10.4 堆排序
10.5 归并排序 10.6 基数排序 10.7 各种排序方法的综合比较
10.1 概 述
一、排序的定义 二、内部排序和外部排序 三、内部排序方法的分类
一、什么是排序?
排序是计算机内经常进行的一种操作, 其目的是将一组“无序”的记录序列调 整为“有序”的记录序列。
} RcdType;
// 记录类型
typedef struct {
RcdType r[MAXSIZE+1]; // r[0]闲置
int
length;
// 顺序表长度
} SqList;
// 顺序表类型
1. 插入类
将无序子序列中的一个或几个 记录“插入”到有序序列中,从而 增加记录的有序子序列的长度。
不同的具体实现方法导致不同的算法描述
直接插入排序(基于顺序查找)
折半插入排序(基于折半查找)
小改进
表插入排序(基于链表存储)
希尔排序(基于逐趟缩小增量)
大改进
1) 直接插入排序
最简单的排序法!
新元素插入到哪里? 在已形成的有序表中线性查找,并在
适当位置插入,把原来位置上的元素向后顺移。
例1:关键字序列T=(13,6,3,31,9,27,5,11),
无序序列 R[i+1..n]
实现“一趟插入排序”可分三步进行:
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]的位置上。
例如:将下列关键字序列 52, 49, 80, 36, 14, 58, 61, 23, 97, 75
调整为
14, 23, 36, 49, 52, 58, 61 ,75, 80, 97
1. 什么是排序? 将一组杂乱无章的数据按一定的规律顺次排列起来。
存放在数据表中
按关键字排序
2. 排序的目的是什么? ——便于查找!
令 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] ; }
void InsertionSort ( SqList &L ) { // 对顺序表 L 作直接插入排序。
2. 交换类
通过“交换”无序序列中的记录 从而得到其中关键字最小或最大的记 录,并将它加入到有序子序列中,以 此方法增加记录的有序子序列的长度。
3. 选择类
从记录的无序子序列中“选择” 关键字最小或最大的记录,并将它加 入到有序子序列中,以此方法增加记 录的有序子序列的长度。
4. 归并类
通过“归并”两个或两个以上的记 录有序子序列,逐步增加记录有序序 列的长度。
10. 2 插入排序
插入排序的基本思想是:
每步将一个待排序的对象,按其关键码大小, 插入到前面已经排好序的一组对象的适当位置上, 直到对象全部插入为止。
简言之,边插入边排序,保证子序列中随时都是排好序的
一趟直接插入排序的基本思想:
有序序列R[1..i-1]
无序序列 R[i..n]
R[i]
有序序列R[1..i]
插入类 交换类 选择类
归并类 基数排序
#待de排fin记e M录A的XS数IZ据E 类10型00定// 待义排如顺下序:表最大长度
typedef int KeyType; // 关键字类型为整数类型
typedef struct {
KeyType key;
// 关键字项
InfoType otherinfo; // 其它数据项
请写出直接插入排序的中间过程序列。
【13】, 6, 3, 31, 9, 27, 5, 11 【6, 13】, 3, 31, 9, 27, 5, 11 【3, 6, 13】, 31, 9, 27, 5, 11 【3, 6, 13,31】, 9, 27, 5, 11 【3, 6, 9, 13,31】, 27, 5, 11 【3, 6, 9, 13,27, 31】, 5, 11 【3, 5, 6, 9, 13,27, 31】, 11 【3, 5, 6, 9, 11,13,27, 31】
一、直接插入排序
利用 “顺序查找”实现
“在R[1..i-1]中查找R[i]的插入位置”
算法的实现要点:
从R[i-1]起向前进行顺序查找,
监视哨设置在R[0];
R[0]
R[i]
j 插入j=位i-置1
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[0]
R[i]
j 插入j=位i置-1 上述循环结束后可以直接进行“插入”
for ( i=2; i<=L.length; ++i )
if (L.r[i].key < L.r[i-1].key) {
L.r[0] = L.r[i];
// 复制为监视哨
for ( j=i-1; L.r[0].key < L.r[j].key; -- j ) L.r[j+1] = L.r[j]; // 记录后移
反之,若参加排序的记录数量很大, 整个序列的排序过程不可能在内存中 完成,则称此类排序问题为外部排序。
三、内部排序的方法
内部排序的过程是一个逐步扩大 记录的有序序列长度的过程。
有序序列区 无 序 序 列 区 经过一趟排序
有序序列区 无 序 序 列 区
基于不同的“扩大” 有序序列长 度的方法,内部排序方法大致可分 下列几种类型:
• 时间效率——排序速度(即排序所花费的全部比较次数) • 空间效率——占内存辅助空间的大小 • 稳定性——若两个记录A和B的关键字值相等,但排序后A、
B的先后次序保持不变,则称这种排序算法是稳定的。
二、内部排序和外部排序
若待排序记录都在内存中,整个排序 过程不需要访问外存便能完成,则称此 类排序问题为内部排序;
第10章序 10.3 快速排序 10.4 堆排序
10.5 归并排序 10.6 基数排序 10.7 各种排序方法的综合比较
10.1 概 述
一、排序的定义 二、内部排序和外部排序 三、内部排序方法的分类
一、什么是排序?
排序是计算机内经常进行的一种操作, 其目的是将一组“无序”的记录序列调 整为“有序”的记录序列。
} RcdType;
// 记录类型
typedef struct {
RcdType r[MAXSIZE+1]; // r[0]闲置
int
length;
// 顺序表长度
} SqList;
// 顺序表类型
1. 插入类
将无序子序列中的一个或几个 记录“插入”到有序序列中,从而 增加记录的有序子序列的长度。
不同的具体实现方法导致不同的算法描述
直接插入排序(基于顺序查找)
折半插入排序(基于折半查找)
小改进
表插入排序(基于链表存储)
希尔排序(基于逐趟缩小增量)
大改进
1) 直接插入排序
最简单的排序法!
新元素插入到哪里? 在已形成的有序表中线性查找,并在
适当位置插入,把原来位置上的元素向后顺移。
例1:关键字序列T=(13,6,3,31,9,27,5,11),
无序序列 R[i+1..n]
实现“一趟插入排序”可分三步进行:
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]的位置上。
例如:将下列关键字序列 52, 49, 80, 36, 14, 58, 61, 23, 97, 75
调整为
14, 23, 36, 49, 52, 58, 61 ,75, 80, 97
1. 什么是排序? 将一组杂乱无章的数据按一定的规律顺次排列起来。
存放在数据表中
按关键字排序
2. 排序的目的是什么? ——便于查找!
令 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] ; }
void InsertionSort ( SqList &L ) { // 对顺序表 L 作直接插入排序。
2. 交换类
通过“交换”无序序列中的记录 从而得到其中关键字最小或最大的记 录,并将它加入到有序子序列中,以 此方法增加记录的有序子序列的长度。
3. 选择类
从记录的无序子序列中“选择” 关键字最小或最大的记录,并将它加 入到有序子序列中,以此方法增加记 录的有序子序列的长度。
4. 归并类
通过“归并”两个或两个以上的记 录有序子序列,逐步增加记录有序序 列的长度。
10. 2 插入排序
插入排序的基本思想是:
每步将一个待排序的对象,按其关键码大小, 插入到前面已经排好序的一组对象的适当位置上, 直到对象全部插入为止。
简言之,边插入边排序,保证子序列中随时都是排好序的
一趟直接插入排序的基本思想:
有序序列R[1..i-1]
无序序列 R[i..n]
R[i]
有序序列R[1..i]
插入类 交换类 选择类
归并类 基数排序
#待de排fin记e M录A的XS数IZ据E 类10型00定// 待义排如顺下序:表最大长度
typedef int KeyType; // 关键字类型为整数类型
typedef struct {
KeyType key;
// 关键字项
InfoType otherinfo; // 其它数据项
请写出直接插入排序的中间过程序列。
【13】, 6, 3, 31, 9, 27, 5, 11 【6, 13】, 3, 31, 9, 27, 5, 11 【3, 6, 13】, 31, 9, 27, 5, 11 【3, 6, 13,31】, 9, 27, 5, 11 【3, 6, 9, 13,31】, 27, 5, 11 【3, 6, 9, 13,27, 31】, 5, 11 【3, 5, 6, 9, 13,27, 31】, 11 【3, 5, 6, 9, 11,13,27, 31】
一、直接插入排序
利用 “顺序查找”实现
“在R[1..i-1]中查找R[i]的插入位置”
算法的实现要点:
从R[i-1]起向前进行顺序查找,
监视哨设置在R[0];
R[0]
R[i]
j 插入j=位i-置1
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[0]
R[i]
j 插入j=位i置-1 上述循环结束后可以直接进行“插入”
for ( i=2; i<=L.length; ++i )
if (L.r[i].key < L.r[i-1].key) {
L.r[0] = L.r[i];
// 复制为监视哨
for ( j=i-1; L.r[0].key < L.r[j].key; -- j ) L.r[j+1] = L.r[j]; // 记录后移
反之,若参加排序的记录数量很大, 整个序列的排序过程不可能在内存中 完成,则称此类排序问题为外部排序。
三、内部排序的方法
内部排序的过程是一个逐步扩大 记录的有序序列长度的过程。
有序序列区 无 序 序 列 区 经过一趟排序
有序序列区 无 序 序 列 区
基于不同的“扩大” 有序序列长 度的方法,内部排序方法大致可分 下列几种类型: