基数排序算法课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《基数排序算法课件.ppt》由用户(ziliao2023)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基数排序 算法 课件
- 资源描述:
-
1、11 什么是算法?如何评判算法的好坏?什么是算法?如何评判算法的好坏?2 时间复杂度和空间复杂度如何表示?时间复杂度和空间复杂度如何表示?3 计算举例计算举例讨论:讨论:第四章第四章:排序和算法分析排序和算法分析2常用常用时间复杂度时间复杂度来衡量来衡量算法的基本特性:算法的基本特性:算法评价指标:算法评价指标:有穷性、确定性、可行性、必有输出有穷性、确定性、可行性、必有输出正确性、可读性、健壮性、高效率与低存储量需求正确性、可读性、健壮性、高效率与低存储量需求(见课本见课本P20)?常用常用空间复杂度空间复杂度来衡量来衡量好的程序设计:好算法好结构好的程序设计:好算法好结构算法:算法:是对特
2、定问题求解步骤的一种描述,它是指令是对特定问题求解步骤的一种描述,它是指令的有限序列,是一系列输入转换为输出的计算步骤。的有限序列,是一系列输入转换为输出的计算步骤。33n+2=O(n)因为因为 3n+2 4n for n 26*2n+n2=O(2n)因为因为6*2n+n2 7*2n for n 4例:例:渐进符号渐进符号(O)的定义:)的定义:当且仅当存在一个正的常当且仅当存在一个正的常数数 C C,使得对所有的,使得对所有的 n n n n0 0 ,有,有 f(n)f(n)Cg(n)Cg(n),则:则:f(n)=f(n)=O(g(n)(g(n)?4该算法的运行时间由程序中所有语句的该算法的
3、运行时间由程序中所有语句的频度频度(即该语(即该语句重复执行的次数)句重复执行的次数)之和之和构成。构成。解:解:分析:分析:显然,语句的频度是显然,语句的频度是1。设语句。设语句2的频度是的频度是f(n),则有:,则有:算法的时间复杂度由嵌套最深层语句的频度决定算法的时间复杂度由嵌套最深层语句的频度决定例:例:分析以下程序段的时间复杂度。分析以下程序段的时间复杂度。i=1;?while(i=n)?i=i*2;?即即f(n)log2n,取最大值取最大值f(n)=log2n所以该程序段的时间复杂度所以该程序段的时间复杂度T(n)=1+f(n)=1+?log2n=?O(?log2n)?()2f n
4、n5频度频度:?语句重复执行的次数称为该语句的频度,记语句重复执行的次数称为该语句的频度,记f(n)。设算法的问题规模为设算法的问题规模为n;时间复杂度时间复杂度:?算法执行时间度量算法执行时间度量,记记T(n)=O(?maxlevel(f(n)?)。对算法各基本操作的频度求和,便可得算法的时间复杂度。对算法各基本操作的频度求和,便可得算法的时间复杂度。但实际中我们所关心的主要是一个算法所花时间的数量但实际中我们所关心的主要是一个算法所花时间的数量级,即取算法各基本操作的最大频度数量级。级,即取算法各基本操作的最大频度数量级。f(n)?=?1?+?n?+?n2?+?n3T(n)?=?O(?n3
5、?)?6例,例,for?(?j?=?1 1?;j=n?;j+?)?X?=?X?+?1 1;X?=?X?+?1 1;for?(?i?=?1 1?;i=n?;i+?)?for?(?i?=?1 1?;i=n?;i+?)?X?=?X?+?1 1;X?=?X?+?1 1;算法执行总的时间花费为算法执行总的时间花费为1+n+2n2算法的时间复杂度为算法的时间复杂度为?T(n)?=?O(n2)?O(1)?,O(logn)?,O(nk)?,O(2n)?7有时,算法中基本操作重复执行的次数随问题的输入有时,算法中基本操作重复执行的次数随问题的输入不同而不同,通常分析不同而不同,通常分析最坏最坏情况下的时间复杂度
6、。情况下的时间复杂度。例,例,顺序查找算法顺序查找算法Status?serch?(?int?a?,int?n?,int?e?)?for?(?i?=?0?;i?=n?-?1 1?;+i?)?if?(?e?=?ai?)?return?TRUE?;最好最好?1?次比较,最坏次比较,最坏?n 次比较,平均次比较,平均?(n+1)/2?次比较。次比较。return?FALSE?;8注:注:1)?O()为渐近符号。()为渐近符号。2)?空间复杂度空间复杂度S(n)按数量级递增顺序也与上表类似。按数量级递增顺序也与上表类似。复杂度高复杂度高复杂度低复杂度低时间复杂度时间复杂度T(n)按数量级递增顺序为:按数
7、量级递增顺序为:多项式阶多项式阶9 排序介绍排序介绍 排序(排序(SortingSorting)是数据处理中一种)是数据处理中一种很重要的运算,同时也是很常用的运很重要的运算,同时也是很常用的运算,一般数据处理工作算,一般数据处理工作25%25%的时间都的时间都在进行排序。简单地说,排序就是把在进行排序。简单地说,排序就是把一组记录(元素)按照某个域的值的一组记录(元素)按照某个域的值的递增(即由小到大)或递减(即由大递增(即由小到大)或递减(即由大到小)的次序重新排列的过程。到小)的次序重新排列的过程。10 排序排序-将一个包含若干数据元素将一个包含若干数据元素(或记录)的任意序列,重新排列
8、成(或记录)的任意序列,重新排列成一个一个按关键字有序按关键字有序的序列的过程。的序列的过程。按待排序按待排序记录所在的位置记录所在的位置,可分为:,可分为:内部排序内部排序:待排序记录存放在内存。:待排序记录存放在内存。外部排序外部排序:当待排序记录数量很大时,:当待排序记录数量很大时,一部分记录需放在外存,在排序过程一部分记录需放在外存,在排序过程中就需要对外存进行访问。中就需要对外存进行访问。11内部排序分为:内部排序分为:插入排序插入排序 快速排序快速排序 选择排序选择排序 归并排序归并排序 基数排序基数排序(略过略过)?排序基本操作排序基本操作比较两个关键字大小比较两个关键字大小将记
9、录从一个位置移动到另一个位置将记录从一个位置移动到另一个位置12待排序记录在内存中怎样存储和处理?待排序记录在内存中怎样存储和处理?顺序顺序排序排序排序时直接移动记录;排序时直接移动记录;链表链表排序排序排序时只移动指针;排序时只移动指针;地址地址排序排序排序时先移动地址,最后再移动记录。排序时先移动地址,最后再移动记录。注:注:地址排序地址排序中可以增设一维数组来专门存放记录的地址。中可以增设一维数组来专门存放记录的地址。按排序算法的时间复杂度不同,可分为按排序算法的时间复杂度不同,可分为3类:类:简单的排序算法:时间效率低,简单的排序算法:时间效率低,O(n2)?先进的排序算法先进的排序算
10、法:?时间效率高,时间效率高,O(?nlog2n?)?基基?数数?排排?序序?算法:时间效率高,算法:时间效率高,O(?dn)?d关键字的位数关键字的位数(长度长度)?13 直接插入排序直接插入排序 希尔排序希尔排序14 基本操作是:基本操作是:将一个记录插入到已将一个记录插入到已排好序的有序表中,从而得到一个排好序的有序表中,从而得到一个新的、记录数增新的、记录数增1 1的有序表。的有序表。基本思想是:基本思想是:当插入第当插入第 i i(i i2)2)个个记录时,前面的记录时,前面的 r r 1,1,r r 2,2,r r i i-1-1已经排好序。这时已经排好序。这时,将将 r r i
11、i 的关键字依次与的关键字依次与r r i i-1,-1,r r i i-22的关键字进行比较的关键字进行比较,并同时将,并同时将相关记录位置后移,直到找到插入相关记录位置后移,直到找到插入 r r i i 的合适位置。的合适位置。15 有一组记录的关键字初始排列如下:有一组记录的关键字初始排列如下:49?38?65?97?76?13?27?49 请使用直接插入排序方法,将以上请使用直接插入排序方法,将以上记录按照记录按照关键字非递减关键字非递减排列。排列。16(49)?38?65?97?76?13?27?49初始关键字初始关键字:i=2:?(38)?(38?49)?65?97?76?13?2
12、7?49i=3:?(65)?(38?49?65)?97?76?13?27?49i=4:?(97)?(38?49?65?97)?76?13?27?49i=5:?(76)?(38?49?65?76?97)?13?27?49i=6:?(13)?(13?38?49?65?76?97)?27?49i=7:?(27)?(13?27?38?49?65?76?97)?49i=8:?(49)?(13?27?38?49?49?65?76?97)?结果结果17void InsertSort(DataType a,int n)/*用直接插入法对a0-an-1排序*/int i,j;DataType temp;for(
13、i=0;i -1&temp.key aj.key)aj+1=aj;j-;aj+1=temp;18void?main(void)?DataType?test6=64,5,7,89,6,24;?int?i,?n?=?6;?SeqList?myList;?ListInitiate(&myList);?for(i?=?0;?i?n;?i+)?ListInsert(&myList,?i,?testi);?InsertSort(myList.list,?myList.size);?for(i=0;?in;?i+)?printf(%d?,?myList.listi.key);#include#include
14、 typedef int KeyType;typedef int KeyType;typedef structtypedef structKeyType key;KeyType key;DataType;DataType;#define MaxSize 100#define MaxSize 100#include SeqList.h#include SeqList.h链表实现算法链表实现算法19 算法简便,容易实现。算法简便,容易实现。当待排序记录数当待排序记录数 n n 很小时,是一种很小时,是一种很好的排序方法。很好的排序方法。当待排序记录数当待排序记录数 n n 很大时,不宜使很大时,不
15、宜使用。用。时间复杂度为时间复杂度为O O(n n2 2)。空间复杂度为空间复杂度为S S(n n)=O=O(1)(1),即使用一,即使用一个辅助单元(第个辅助单元(第0 0个单元)。个单元)。20基本思想:基本思想:1 1)先取一个正整数先取一个正整数d1d1(d1d1记录数记录数n n),把所有相隔),把所有相隔d1d1的记录放一组,的记录放一组,这样就把整个待排记录序列分割成若这样就把整个待排记录序列分割成若干个子序列,对每个子序列进行直接干个子序列,对每个子序列进行直接插入排序。插入排序。2 2)再取再取 d2 d1 d2 d1,把所有相隔,把所有相隔 d2 d2 的记录放一组,对每一
16、组内的记录进的记录放一组,对每一组内的记录进行直接插入排序。行直接插入排序。3 3)最后取最后取 di di1 1,即把所有记录放,即把所有记录放在一组进行直接插入排序。在一组进行直接插入排序。21对下列关键字进行希尔排序:对下列关键字进行希尔排序:49?38?65?97?76?13?27?48?55?4取取 d15,d23,d31。22 初始关键字初始关键字:49?38?65?97?76?13?27?48?55?4取取d1=5d1=5一趟分组:一趟分组:49?38?65?97?4?13?27?48?55?76 一趟排一趟排序结果:序结果:13?27?48?55?4?49?38?65?97?7
17、623取取d2=3d2=3二趟分组:二趟分组:13?27?48?55?4?49?38?65?97?76二趟排二趟排序结果:序结果:13?4?48?38?27?49?55?65?97?76取取d3=1d3=1三趟分组:三趟分组:13?4?48?38?27?49?55?65?97?76三趟排三趟排序结果:序结果:4?13?27?38?48?49?55?65?76?9724 子序列的构成不是简单的子序列的构成不是简单的“逐段分割逐段分割”,而是将相隔某个增量的记录组成一个子而是将相隔某个增量的记录组成一个子序列序列 关键字较小的记录跳跃式前移,在进行关键字较小的记录跳跃式前移,在进行最后一趟增量为最
18、后一趟增量为1 1的插入排序时,序列已的插入排序时,序列已基本有序基本有序 设设n n为待排序记录个数,一般为待排序记录个数,一般didi取值如下:取值如下:d1?n/2,d2?d1/2,直到,直到di1。25 交换排序的基本思想是:利用交换数据元交换排序的基本思想是:利用交换数据元素的位置进行排序的方法。素的位置进行排序的方法。交换排序的主要算法有:交换排序的主要算法有:?1)?冒泡排序冒泡排序?2)?快速排序快速排序261 1、基本思路:、基本思路:每趟不断将记录两两比较,并按每趟不断将记录两两比较,并按“前小后大前小后大”(或(或“前大后小前大后小”)规则交换。)规则交换。2 2、优点:
19、、优点:每趟结束时,不仅能挤出一个最大值到最后面位每趟结束时,不仅能挤出一个最大值到最后面位置,还能置,还能同时部分理顺其他元素同时部分理顺其他元素;一旦下趟没有交;一旦下趟没有交换发生,还可以换发生,还可以提前结束排序提前结束排序。例:例:关键字序列关键字序列?T=(21,25,49,25*,16,08),请按从),请按从小到大的顺序,写出冒泡排序的具体实现过程。小到大的顺序,写出冒泡排序的具体实现过程。初态:初态:第第1趟趟第第2趟趟第第3趟趟第第4趟趟第第5趟趟21,25,49,?25*,16,?0821,25,25*,16,?08?,?4921,25,?16,?08?,25*,4921
20、,16,?08?,25,?25*,4916,08?,21,?25,?25*,4908,16,?21,?25,?25*,4927 void BubbleSort(DataType a,int n)void BubbleSort(DataType a,int n)?int i,j,flag=1;int i,j,flag=1;DataType temp;DataType temp;for(i=1;i n&flag=1;i+)for(i=1;i n&flag=1;i+)?flag=0;flag=0;for(j=0;j n-i;j+)for(j=0;j aj+1.key)if(aj.key aj+1.k
21、ey)flag=1;flag=1;temp=aj;temp=aj;aj=aj+1;aj=aj+1;aj+1=temp;aj+1=temp;282.1 2.1 冒泡排序的算法分析冒泡排序的算法分析最好情况:最好情况:初始排列已经有序,只执行一趟起泡,做初始排列已经有序,只执行一趟起泡,做?n-1?次关键码比较,不移动对象。次关键码比较,不移动对象。最坏情形:最坏情形:初始排列逆序,初始排列逆序,算法要执行算法要执行n-1 1趟起泡,第趟起泡,第i趟趟(1?i?n)做了做了n-i 次关键码比较,执行了次关键码比较,执行了n-i 次对象交换。次对象交换。此时的比较总次数此时的比较总次数KCN和记录移
22、动次数和记录移动次数RMN为:为:11111233121nininninRMNnninKCN)()()()(因此:因此:时间效率:时间效率:O O(n n2 2)因为要考虑最坏情况因为要考虑最坏情况空间效率:空间效率:O O(1 1)只在交换时用到一个缓冲单元只在交换时用到一个缓冲单元稳稳 定定 性:性:稳定稳定 2525和和2525*在排序前后的次序未改变在排序前后的次序未改变292.2?快速排序快速排序冒泡排序的一种改进算法。冒泡排序的一种改进算法。思想思想:以以首记录首记录作为作为轴记录轴记录,从前、后双向扫描序列,通过交换,实,从前、后双向扫描序列,通过交换,实现大值记录后移,小值记录
23、前移,最终将轴记录安置在一个适现大值记录后移,小值记录前移,最终将轴记录安置在一个适当的位置。当的位置。(小值记录在前、大值记录在后小值记录在前、大值记录在后)?轴记录轴记录将原序列分割成两部分,依次对前后两部分重新设定轴将原序列分割成两部分,依次对前后两部分重新设定轴记录,继而分别再进行快速排序。记录,继而分别再进行快速排序。直至整个序列有序。直至整个序列有序。30Input:an array Ap,rQuicksort(A,p,r)if(p r)q=Partition(A,p,r)/q是基准关键字的位置Quicksort(A,p,q-1)Quicksort(A,q+1,r)31 一趟快速排
24、序的过程一趟快速排序的过程(partition)(partition):附设两附设两个指针个指针 i i 和和j j,i i 指向第一个关键字指向第一个关键字(基基准关键字准关键字),),j j 指向最后一个关键字。指向最后一个关键字。首先首先从从 j j 所指位置开始所指位置开始向前查找向前查找第一个第一个关键字关键字小于小于 keykey 的记录,找到后将其的记录,找到后将其和和 i i 所指记录所指记录交换交换。然后再然后再从从 i i 所指位置开始所指位置开始向后查找向后查找第一第一个关键字个关键字大于大于 key key 的记录,找到后将其的记录,找到后将其和和 j j 所指记录所指
25、记录交换交换。重复上述两步,直到重复上述两步,直到 i?j 为止。此时,为止。此时,所有比所有比 keykey 小的关键字都放到左边,所有小的关键字都放到左边,所有比比 key key 大的关键字都放到右边大的关键字都放到右边32 4 6?5 5?1 3?4 2?9 4?0 5?1 7?7 0?i?j?4 6?5 5?1 3?4 2?9 4?0 5?1 7?7 0?i?j?1 7?5 5?1 3?4 2?9 4?0 5?4 6?7 0?i?j?1 7?4 6?1 3?4 2?9 4?0 5?5 5?7 0?i?j?1 7?0 5?1 3?4 2?9 4?4 6?5 5?7 0?i?j?1 7?
展开阅读全文