排序的概念与种类.ppt

第8章 排序;本章导读;8.1 排序的基本概念;假设含有n个记录的序列为: {R1,R2 ,…,Rn} (8-1) 其相应的关键字序列为: {K1,K2 ,…,Kn} 需确定1,2, …,n的一种排序p1,p2, …,pn,使其 相应的关键字满足如下关系: Kp1≤Kp2≤…≤Kpn (8-2) 即使得式(8-1)的序列成为一个按关键字有序的序列 {R p1,R p2 ,…,Rpn} (8-3) 这个将原有表中任意顺序的记录变成一个按关键字有序排列的过程称为排序。 ;2.排序分类 ;(3) 内部排序与外部排序:在排序中,若数据表中的所有记录的排列过程都是在内存中进行的,称为内部排序。由于待排序的记录数量太多,在排序过程中不能同时把全部记录放在内存,需要不断地通过在内存和外存之间交换数据元素来完成整个排序的过程,称为外部排序。在外部排序情况下,只有部分记录进入内存,在内存中进行内部排序,待排序完成后再交换到外部存储器中加以保存。然后再将其它待排序的记录调入内存继续排序。这一过程需要反复进行,直到全部记录排出次序为止。显然,内部排序是外部排序的基础,本章先介绍内部排序的各种方法,最后再讨论外部排序。 ;8.1.2 排序算法的效率分析 ;2.空间复杂度分析 ;8.2 插入排序 ;8.2.1 直接插入排序 ;向有序表中插入记录,主要完成如下操作: (1) 搜索插入位置。 (2) 移动插入点及其以后的记录空出插入位置。 (3) 插入记录。;void Insert_Sort(int R[],int n) {int i,j; for(i=2;i=n; i++) //表示待插入元素的下标 {R[0]=R[i]; //设置监视哨保存待插入元素,腾出R[i]空间 j=i-1; //j指示当前空位置的前一个元素 while(R[0].keyR[j].key)//搜索插入位置并后移腾出空 {R[j+1]=R[j]; j--; } R[j+1]=R[0]; //插入元素 } }; 显然,开始时有序表中只有1个记录[R[1]],然后需要将R[2]~R[n]的记录依次插入到有序表中,总共要进行n-1次插入操作。首先从无序表中取出待插入的第i个记录R[i],暂存在R[0]中;然后将R[0].key依次与R[i-1].key,R[i-2].key,…进行比较,如果R[0].keyR[i-j].key(1≤j≤i-1),则将R[i-j]后移一个单元;如果R[0].key≥R[i-j].key,则找到R[0]插入的位置i-j+1,此位置已经空出,将R[0] (即R[i])记录直接插入即可。然后采用同样的方法完成下一个记录R[i+1]的插入排序。如此不断进行,直到完成记录R[n]的插入排序,整个序列变成按关键字非递减的有序序列为止。在搜索插入位置的过程中,R[0].key与R[i-j].key进行比较时,如果j=i,则循环条件 R[0].keyR[i-j].key不成立,从而退出while 循环。由此可见R[0]起到了监视哨的作用,避免了数组下标的出界。 ;【例8-1】假设有7个待排序的记录,它们的关键字分别为23,4,15,8,19,24,15,用直接插入法进行排序。;空间性能:该算法仅需要一个记录的辅助存储空间,空间复杂度为O(1)。 时间性能:整个算法执行for循环n-1次,每次循环中的基本操作是比较和移动,其总次数取决于数据表的初始特性,可能有以下几种情况: (1)当初始记录序列的关键字已是递增排列时,这是最好的情况。算法中while语句的循环体执行次数为0,因此,在一趟排序中关键字的比较次数为1,即R[0]的关键字与R[j]的关键字比较。而移动次数为2,即R[i]移动到R[0]中,R[0]移动到R[j+1]中。所以,整个排序过程中的比较次数和移动次数分别为(n-1)和2×(n-1), 因而其时间复杂度为O(n)。 ;(2)当初始数据序列的关键字序列是递减排列时,这是最坏的情况。在第i次排序时, while语句内的循环体执行次数为i。因此,关键字的比较次数为i,而移动次数为i+1。所以,整个排序过程中的比较次数和移动次数分别为:;8.2.2 折半插入排序 ; 设置始指针low,指向有序表的第一个记录,尾指针high,指向有序表的最后一个记录,中间指针mid指向有序表中间位置的记录。每次将待插入记录的关键字与mid位置记录的关键字进行比较,从而确定待插入记录的插入位置。折半插入排序算法如下: ;while(low=high)

您可能关注的文档

文档评论(0)

1亿VIP精品文档

相关文档