《《数据结构与算法》PPT课堂课件-第6章-排序与选择.ppt》由会员分享,可在线阅读,更多相关《《数据结构与算法》PPT课堂课件-第6章-排序与选择.ppt(41页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1第6章 排序与选择排序定义将一个数据元素(或记录)的任意序列,重新排列成一个按关键字有序的序列叫排序 排序分类n按待排序记录所在位置内部排序:待排序记录存放在内存外部排序:排序过程中需对外存进行访问的排序n按排序依据原则插入排序:直接插入排序、折半插入排序、希尔排序交换排序:冒泡排序、快速排序选择排序:简单选择排序、堆排序归并排序:2-路归并排序基数排序2n按排序所需工作量简单的排序方法:T(n)=O(n)先进的排序方法:T(n)=O(nlogn)基数排序:T(n)=O(d*n)(d为位数)排序基本操作n比较两个关键字大小n将记录从一个位置移动到另一个位置3n6.1 简单排序算法 1 冒泡排
2、序n排序过程将第一个记录的关键字与第二个记录的关键字进行比较,若为逆序r1.keyr2.key,则交换;然后比较第二个记录与第三个记录;依次类推,直至第n-1个记录和第n个记录比较为止第一趟冒泡排序第一趟冒泡排序,结果关键字最大的记录被安置在最后一个记录上对前n-1个记录进行第二趟冒泡排序,结果使关键字次大的记录被安置在第n-1个记录位置重复上述过程,直到“在一趟排序过程中没有进行过交换记录的操作”为止4例:49 38 97 76 13 27 30 初始关键字38 49 76 13 27 30 97 第一趟38 49 13 27 30 76 第二趟38 13 27 30 49 第四趟13 27
3、 30 38 第五趟13 27 30 第六趟384976971397279730971376767627301349274930491338383038275n算法描述n算法评价时间复杂度最好情况(正序)Y比较次数:n-1Y移动次数:0最坏情况(逆序)Y比较次数:Y移动次数:空间复杂度:S(n)=O(1)T(n)=O(n)6n2 插入排序直接插入排序n排序过程:整个排序过程为n-1趟插入,即先将序列中第1个记录看成是一个有序子序列,然后从第2个记录开始,逐个进行插入,直至整个序列有序n算法描述7例49 38 65 97 76 13 27i=2 38 (38 49)65 97 76 13 27i
4、=3 65 (38 49 65)97 76 13 27i=4 97 (38 49 65 97)76 13 27i=5 76 (38 49 65 76 97)13 27i=6 13 (13 38 49 65 76 97)27i=1 ()i=7 (13 38 49 65 76 97)2727jjjjjj977665493827 (13 27 38 49 65 76 97)排序结果:8n算法评价时间复杂度若待排序记录按关键字从小到大排列(正序)Y关键字比较次数:Y记录移动次数:若待排序记录按关键字从大到小排列(逆序)Y关键字比较次数:Y记录移动次数:若待排序记录是随机的,取平均值Y关键字比较次数:Y
5、记录移动次数:T(n)=O(n)空间复杂度:S(n)=O(1)Ch8_1.c9折半插入排序n排序过程:用折半查找方法确定插入位置的排序叫例i=1 (30)13 70 85 39 42 6 20i=2 13 (13 30)70 85 39 42 6 20i=7 6 (6 13 30 39 42 70 85)20.i=8 20 (6 13 30 39 42 70 85)20sjmi=8 20 (6 13 30 39 42 70 85)20sjmi=8 20 (6 13 30 39 42 70 85)20sjmi=8 20 (6 13 30 39 42 70 85)20sji=8 20 (6 13
6、20 30 39 42 70 85)10n算法描述n算法评价时间复杂度:T(n)=O(n)空间复杂度:S(n)=O(1)Ch8_2.c11希尔排序(缩小增量法)n排序过程:先取一个正整数d1n,把所有相隔d1的记录放一组,组内进行直接插入排序;然后取d2d1,重复上述分组和排序操作;直至di=1,即所有记录放进一个组中排序为止12取d3=1三趟分组:13 27 48 55 4 49 38 65 97 76三趟排序:4 13 27 38 48 49 55 65 76 97例 初始:49 38 65 97 76 13 27 48 55 4一趟排序:13 27 48 55 4 49 38 65 97
7、 76二趟排序:13 4 48 38 27 49 55 65 97 76取d1=5一趟分组:49 38 65 97 76 13 27 48 55 4取d2=3二趟分组:13 27 48 55 4 49 38 65 97 7613n算法描述Ch8_3.c例49 38 65 97 76 13 27 48 55 4#define T 3int d=5,3,1;ji49133827一趟排序:13 27 48 55 4 49 38 65 97 76jiji274jiji55ji38jijiji二趟排序:13 4 48 38 27 49 55 65 97 76jiji6548ji9755ji76414n希
8、尔排序特点子序列的构成不是简单的“逐段分割”,而是将相隔某个增量的记录组成一个子序列希尔排序可提高排序速度,因为分组后n值减小,n更小,而T(n)=O(n),所以T(n)从总体上看是减小了关键字较小的记录跳跃式前移,在进行最后一趟增量为1的插入排序时,序列已基本有序增量序列取法无除1以外的公因子最后一个增量值必须为115快速排序n基本思想:通过一趟排序,将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录进行排序,以达到整个序列有序n排序过程:对rst中记录进行一趟快速排序,附设两个指针i和j,设枢轴记录rp=rs,x=rp.key初始时令i
9、=s,j=t首先从j所指位置向前搜索第一个关键字小于x的记录,并和rp交换再从i所指位置起向后搜索,找到第一个关键字大于x的记录,和rp交换重复上述两步,直至i=j为止再分别对两个子序列进行快速排序,直到每个子序列只含有一个记录为止16例初始关键字:49 38 65 97 76 13 27 50 ijxji 完成一趟排序:(27 38 13)49 (76 97 65 50)分别进行快速排序:(13)27 (38)49 (50 65)76 (97)快速排序结束:13 27 38 49 50 65 76 974927ijijij4965ji1349ij4997ij17n算法描述n算法评价时间复杂度
10、最好情况(每次总是选到中间值作枢轴)T(n)=O(nlog2n)最坏情况(每次总是选到最小或最大元素作枢轴)T(n)=O(n)空间复杂度:需栈空间以实现递归最坏情况:S(n)=O(n)一般情况:S(n)=O(log2n)T(n)=O(n)Ch8_5.c18n3 选择排序简单选择排序n排序过程首先通过n-1次关键字比较,从n个记录中找出关键字最小的记录,将它与第一个记录交换再通过n-2次比较,从剩余的n-1个记录中找出关键字次小的记录,将它与第二个记录交换重复上述操作,共进行n-1趟排序后,排序结束19例初始:49 38 65 97 76 13 27 kjjjjjjkki=11349一趟:13
11、38 65 97 76 49 27 i=2kkjjjjj2738二趟:13 27 65 97 76 49 38 三趟:13 27 38 97 76 49 65 四趟:13 27 38 49 76 97 65 五趟:13 27 38 49 65 97 76 六趟:13 27 38 49 65 76 97 排序结束:13 27 38 49 65 76 9720n算法描述n算法评价时间复杂度记录移动次数Y最好情况:0Y最坏情况:3(n-1)比较次数:空间复杂度:S(n)=O(1)T(n)=O(n)Ch8_6.c21堆排序n堆的定义:n个元素的序列(k1,k2,kn),当且仅当满足下列关系时,称之为堆
12、或(i=1,2,.n/2)kik2ikik2i+1kik2ikik2i+1例 (96,83,27,38,11,9)例 (13,38,27,50,76,65,49,97)962791138831327384965765097可将堆序列看成完全二叉树,则堆顶元素(完全二叉树的根)必为序列中n个元素的最小值或最大值22n堆排序:将无序序列建成一个堆,得到关键字最小(或最大)的记录;输出堆顶的最小(大)值后,使剩余的n-1个元素重又建成一个堆,则可得到n个元素的次小值;重复执行,得到一个有序序列,这个过程叫n堆排序需解决的两个问题:如何由一个无序序列建成一个堆?如何在输出堆顶元素之后,调整剩余元素,使
13、之成为一个新的堆?n第二个问题解决方法筛选方法:输出堆顶元素之后,以堆中最后一个元素替代之;然后将根结点值与左、右子树的根结点值进行比较,并与其中小者进行交换;重复上述操作,直至叶子结点,将得到新的堆,称这个从堆顶至叶子的调整过程为“筛选”23例13273849657650979727384965765013输出:132749389765765013输出:139749382765765013输出:13 273849502765769713输出:13 276549502738769713输出:13 27 38244965502738769713输出:13 27 38766550273849971
14、3输出:13 27 38 495065762738499713输出:13 27 38 499765762738495013输出:13 27 38 49 506597762738495013输出:13 27 38 49 509765762738495013输出:13 27 38 49 50 65257665972738495013输出:13 27 38 49 50 659765762738495013输出:13 27 38 49 50 65 769765762738495013输出:13 27 38 49 50 65 76 9726算法描述n第一个问题解决方法方法:从无序序列的第n/2个元素(即
15、此无序序列对应的完全二叉树的最后一个非终端结点)起,至第一个元素止,进行反复筛选27例 含8个元素的无序序列(49,38,65,97,76,13,27,50)4965382713769750496538271376509749133827657650974913382765765097132738496576509728算法描述n算法评价时间复杂度:最坏情况下T(n)=O(nlogn)空间复杂度:S(n)=O(1)Ch8_7.c29n6.3 归并排序归并将两个或两个以上的有序表组合成一个新的有序表,叫2-路归并排序n排序过程设初始序列含有n个记录,则可看成n个有序的子序列,每个子序列长度为1两
16、两合并,得到n/2个长度为2或1的有序子序列再两两合并,如此重复,直至得到一个长度为n的有序序列为止30例初始关键字:49 38 65 97 76 13 27一趟归并后:38 49 65 97 13 76 27二趟归并后:38 49 65 97 13 27 76三趟归并后:13 27 38 49 65 76 9731算法描述n算法评价时间复杂度:T(n)=O(nlog2n)空间复杂度:S(n)=O(n)Ch8_9.c32n6.5 基数排序多关键字排序n定义:例 对52张扑克牌按以下次序排序:23A23A23A23A两个关键字:花色()面值(23A)并且“花色”地位高于“面值”n多关键字排序方法
17、最高位优先法(MSD):先对最高位关键字k1(如花色)排序,将序列分成若干子序列,每个子序列有相同的k1值;然后让每个子序列对次关键字k2(如面值)排序,又分成若干更小的子序列;依次重复,直至就每个子序列对最低位关键字kd排序;最后将所有子序列依次连接在一起成为一个有序序列33最低位优先法(LSD):从最低位关键字kd起进行排序,然后再对高一位的关键字排序,依次重复,直至对最高位关键字k1排序后,便成为一个有序序列MSD与LSD不同特点按MSD排序,必须将序列逐层分割成若干子序列,然后对各子序列分别排序按LSD排序,不必分成子序列,对每个关键字都是整个序列参加排序;并且可不通过关键字比较,而通
18、过若干次分配与收集实现排序链式基数排序n基数排序:借助“分配”和“收集”对单逻辑关键字进行排序的一种方法n链式基数排序:用链表作存储结构的基数排序34n链式基数排序步骤设置10个队列,fi和ei分别为第i个队列的头指针和尾指针第一趟分配对最低位关键字(个位)进行,改变记录的指针值,将链表中记录分配至10个链队列中,每个队列记录的关键字的个位相同第一趟收集是改变所有非空队列的队尾记录的指针域,令其指向下一个非空队列的队头记录,重新将10个队列链成一个链表重复上述两步,进行第二趟、第三趟分配和收集,分别对十位、百位进行,最后得到一个有序序列35例初始状态:278109063930589184505
19、269008083109589269278063930083184505008e0e1e2e3e4e5e6e7e8e9f0f1f2f3f4f5f6f7f8f9一趟分配930063083184505278008109589269一趟收集:36505008109930063269278083184589二趟收集:083184589063505269930e0e1e2e3e4e5e6e7e8e9f0f1f2f3f4f5f6f7f8f9二趟分配008109278930063083184505278008109589269一趟收集:37008063083109184269278505589930三趟收集
20、:109008184930e0e1e2e3e4e5e6e7e8e9f0f1f2f3f4f5f6f7f8f9三趟分配063083269278505589505008109930063269278083184589二趟收集:38算法描述n算法评价时间复杂度:分配:T(n)=O(n)收集:T(n)=O(rd)T(n)=O(d(n+rd)其中:n记录数 d关键字数 rd关键字取值范围 空间复杂度:S(n)=2rd个队列指针+n个指针域空间Ch8_10.c39初始状态:127810906393058918450526900808302345678910f0=0 e0=0f1=0 e1=0f2=0 e2=
21、0f3=0 e3=0f4=0 e4=0f5=0 e5=0f6=0 e6=0f7=0 e7=0f8=0 e8=0f9=0 e9=01122334456677891049300630831845052780081095892690310671925840f0=0 e0=0f1=0 e1=0f2=0 e2=0f3=0 e3=0f4=0 e4=0f5=0 e5=0f6=0 e6=0f7=0 e7=0f8=0 e8=0f9=0 e9=0134477 910493006308318450527800810958926903106719258一趟收集:31016258750500810993006326927808318458909243811065二趟收集:41750500810993006326927808318458909243811065二趟收集:f0=0 e0=0f1=0 e1=0f2=0 e2=0f3=0 e3=0f4=0 e4=0f5=0 e5=0f6=0 e6=0f7=0 e7=0f8=0 e8=0f9=0 e9=04479287928900806308310918426927850558993003102681754三趟收集:311065
限制150内