数据结构课件--第九章.

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

77 55 14 35 77 55 14 35 77 55 14 35 77 } 55 14 35 62 77 } 14 35 55 62 77 } 35 48 55 62 77 } 48 55 62 77
98 98 98 98 98 98 98 返回主目录 98 }
假设待排序记录存放在r[1..n]之中,为了提高效率,我们附设 一个监视哨r[0],使得r[0]始终存放待插入的记录。
动元素的时间耗费,所以折半插入排序的总的时间
复杂度仍然是O(n2)。
返回主目录
9.2.3 表插入排序
表插入排序是采用链表存储结构进行插入排序的方法。 表插入排序的基本思想是:先在待插入记录之前的有序子链 表中查找应插入位置,然后将待插入记录插入链表。
类型说明如下: typedef int KeyType; typedef struct {
/* 确定插入位置l */
{mid=(low+high) / 2;
if ( x.key< r[mid].key ) high=mid-1;
else low=mid+1;} for ( j=i-1 ; j>= low; --j ) r[j+1]= r[j]; r[low]=x; }
/* 记录依次向后移动 */ /* 插入记录 */
返回主目录
}
算法分析:
采用折半插入排序法,可减少关键字的比较次
数。每插入一个元素,需要比较的次数最大为折半
判定树的深度,如插入第i个元素时,设i=2j,则需进
行log2i次比较,因此插入n-1个元素的平均wenku.baidu.com键字的 比较次数为O(nlog2n)。
虽然折半插入排序法与直接插入排序法相比较,
改善了算法中比较次数的数量级,但其并未改变移
返回主目录
9.2 插入类排序
基本思想:在一个已排好序的记录子集的基础上,每一步将 下一个待排序的记录有序插入到已排好序的记录子集中,直
到将所有待排记录全部插入为止。
9.2.1 直接插入排序
基本操作是将第i个记录插入到前面i-1个已排好序的记录中, 具体过程为:将第i个记录的关键字Ki顺次与其前面记录的 关键字Ki-1,Ki-2,…K1进行比较,将所有关键字大于Ki的 记录依次向后移动一个位置,直到遇见一个关键字小于或者 等于Ki的记录Kj,此时Kj后面必为空位置,将第i个记录插 入空位置即可。
for ( i=n-1 ; i>= 1; --i)
返回主目录
内部排序:整个排序过程完全在内存中进行,称为 内部排序。
外部排序:由于待排序记录数据量太大,内存无 法容纳全部数据,排序需要借助外部存储设备才 能完成,称为外部排序。
稳定排序和不稳定排序:假设Ki=Kj(1≤i≤n, 1≤j≤n,i≠j),若在排序前的序列中Ri领先于 Rj(即i<j),经过排序后得到的序列中Ri仍领先于Rj, 则称所用的排序方法是稳定的 ;反之,当相同关键
直接插入排序方法是稳定的排序方法。
返回主目录
9.2.2 折半插入排序
void BinSort (RecordType r[],int length) /*对记录数组r进行折半插入排序,length为数组的长度*/
{for ( i=2 ; i<=length ; ++i )
{x= r[i];low=1; high=i-1; while (low<=high )
第九章 内部排序
9.1 排序的基本概念 9.2 插入类排序 9.3 交换类排序法 9.4 选择类排序法 9.5 归并排序 9.6 分配类排序 9.7 各种排序方法的综合比较
返回主目录
9.1 排序的基本概念
排序:有n个记录的序列{R1,R2,…,Rn},其相应 关键字的序列是{K1,K2, …,Kn },相应的下标 序列为1,2,…, n。通过排序,要求找出当前下 标序列1,2,…, n的一种排列p1,p2, …,pn, 使得相应关键字满足如下的非递减(或非递增)关 系,即:Kp1≤ Kp2≤…≤ Kpn ,这样就得到一个按 关键字有序的记录序列:{Rp1, Rp2, …, Rpn}。
void InsSort(RecordType r[],int length)
直 /*对记录数组r做直接插入排序,length为数组的长度*/ 接 插{ 入 for ( i=2 ; i< length ; i++ )
排{
序 r[0]=r[i]; j=i-1;
/*将待插入记录存放到r[0]中*/
算 while (r[0].key< r[j].key ) /* 寻找插入位置 */
法 {r[j+1]= r[j]; j=j-1;}
r[j+1]=r[0];
/*将待插入记录插入到已排序的序列中*/
}
} /* InsSort */
返回主目录
该算法的要点是:①使用监视哨r[0]临时保存待插入的记录。 ②从后往前查找应插入的位置。③查找与移动用同一循环完 成。 直接插入排序算法分析: 从空间角度来看,它只需要一个辅助空间r[0]。 从时间耗费角度来看,主要时间耗费在关键字比较和移动元 素上。
字的领先关系在排序过程中发生变化者,则称所用
的排序方法是不稳定的。
返回主目录
在排序过程中,一般进行两种基本操作: (1)比较两个关键字的大小; (2)将记录从一个位置移动到另一个位置。 对于第二种操作,需要采用适当地存储方式,即向 量结构、链表结构以及记录向量与地址向量结合的 表示方法。
我们重点来讨论在向量存储结构上各种排序方法的 实现。
返回主目录
下面给出了一个完整的直接插入排序实例。图中 大括号内为当前已排好序的记录子集合。
A) { 48 } B) { 48 C) { 35 D) { 35 E) { 35 F) { 14 G) { 14 H) { 14
62 35 62 } 35 48 62 } 48 62 48 55 35 48 35 35 35 35
KeyType key; OtherType other_data; int next; } RecordType1;
返回主目录
表插入排序算法
void SLinkListSort(RecordType1 r[],int length)
{
int n=length;
r[0].next=n; r[n].next=0;
相关文档
最新文档