1、手机端页面文档仅支持阅读 15 页,超过 15 页的文档需使用电脑才能全文阅读。
2、下载的内容跟在线预览是一致的,下载后除PDF外均可任意编辑、修改。
3、所有文档均不包含其他附件,文中所提的附件、附录,在线看不到的下载也不会有。
这是第遍。
第遍排序使用同样的办法,将第遍排序后的记录按其关键字的十位数第位分配到相应的队列中,再把队列中的记录收集和排列起来。
继续进行下去。
第遍排序时,按第遍排序后记录的关键字的最高位第位进行分配,再收集和排列各队列中的记录,医得到了原文件的有序文件,这就是以为基的关键字的基数排序法。
关键字初始状态个队列关键字第遍,按个位数分配收集后收集后第二遍,按十位数分配例如,给出关键字序列其中关键字用个在的前面补足到位,余关键字均为位的正整数。
进行基数排序的过程如图所示。
在这个例子中,文件和所有的队列都表示成向量维数组。
显然,关键字的位有可能均为同个数字例如,个数都为,这时所有的记录都同时装入同个队列中例如,同时装入号队列中。
因此,如果每个队列的大小和文件大小相同,则需要个倍于文件大小的附加空间。
此外,排序时需要进行反复的分配和收集记录。
所以,采用顺序表示是不方便的。
基数排序所需的计算时间不仅与文件的大小有关,而且还与关键字的位数关在概念上看作棵顺序二叉树,并将它转换成个堆。
这时,根结点具有最大值,删去根结点,然后将剩下的结点重新调整为个堆。
反复进行下去,直到只剩下个结点为止。
堆排序的关键步骤是如何把棵顺序二叉树调值指关键字,下同,而且堆中任何个结点的非空左右子树都是个堆,它的根结点到任叶子的每条路径上的结点都是递减有序的。
堆排序的基本思想是首先把待排序的顺序表示维数组的文件则的右孩子不存在。
什么是堆呢堆是个具有这样性质的顺序二叉树,每个非终端结点记录的关键字大于等于它的孩子结点的关键字。
例如,图所示的顺序二叉树就是个堆。
显然,在个堆中,根结点具有最大为图所示的顺序二叉树。
当我们把顺序表示的文件,看作为顺序二叉树时,由顺序二叉树的性质可知记录,则的左孩子不存在的右孩子是记录,但若二叉树可以用个长度为的向量维数组来表示反过来,个有个记录的顺序表示的文件,在概念上可以看作是棵有个结点即记录的顺序二叉树。
例如,个顺序表示的文件可以看作是在选择排序的基础上发展起来的。
它比选择排序的效率要高。
在堆排序中,把待排序的文件逻辑上看作是棵顺序二叉树,并用到堆的概念。
在介绍堆排序之前,先引入堆的概念。
我们回忆下,棵有个结点的顺序排序,结果使次大的数被安置在第个元素位置重复上述过程,经趟冒泡排序后,排序结束堆排序堆排序二个数,若为逆序,则交换然后比较第二个数与第三个数依次类推,直至第个数和第个数比较为止第趟冒泡排序,结果最大的数被安置在最后个元素位置上对前个数进行第二趟冒泡!冒泡排序冒泡排序的思路很简单,将相邻两个数组元素进行比较,将小的调整到前面。
排序过程比较第个数与第第遍扫描时,在余下的记录中,再选出具有最小关键字的记录需要比较次,第扫描时,在最后的个记录中,比较次选出最小关键字的记录。
算法举例第趟第二趟第三趟第四趟第五趟中选出个关键字最小的记录,若不是,即则交换和的位置否则,不进行交换。
的值加。
第遍扫描时,在个记录中为了选出最小关键字的记录,需要进行次比较,单排序法。
个记录最多只需进行次交换就可以直接到达它的排序位置。
设待排序的文件为进行选择排序的基本步骤如下置为当时,重复下列步骤当逐渐增多,但由于已经按作为距离排过序,使文件较近于有序状态,所以新的各趟排序过程也较快。
因此,希尔排序在较率上较直接接入排序有较大的改进。
选择排序选择排序也是种简,即直接插入排序的最好时间复杂度和最坏时间复杂度差别不大。
在希尔排序时增量较大,分组较多,每组的记录数目少,故各组内直接插入较快,后来增量逐渐缩小,分组数逐渐减少,而各组的记录数目么希尔排序的时间性能优于直接插入排序呢我们知道直接插入排序在文件初态为正序时所需要时间最少,实际上,当文件初基本有序时直接插入排序所需的比较和移动次数均较少。
另面,当值较小时,和的差别也较小。
后来又有人提出其它选择增量序列的方法,如以及。
为什么。
后来又有人提出其它选择增量序列的方法,如以及。
为什么希尔排序的时间性能优于直接插入排序呢我们知道直接插入排序在文件初态为正序时所需要时间最少,实际上,当文件初基本有序时直接插入排序所需的比较和移动次数均较少。
另面,当值较小时,和的差别也较小,即直接插入排序的最好时间复杂度和最坏时间复杂度差别不大。
在希尔排序时增量较大,分组较多,每组的记录数目少,故各组内直接插入较快,后来增量逐渐缩小,分组数逐渐减少,而各组的记录数目逐渐增多,但由于已经按作为距离排过序,使文件较近于有序状态,所以新的各趟排序过程也较快。
因此,希尔排序在较率上较直接接入排序有较大的改进。
选择排序选择排序也是种简单排序法。
个记录最多只需进行次交换就可以直接到达它的排序位置。
设待排序的文件为进行选择排序的基本步骤如下置为当时,重复下列步骤当中选出个关键字最小的记录,若不是,即则交换和的位置否则,不进行交换。
的值加。
第遍扫描时,在个记录中为了选出最小关键字的记录,需要进行次比较,第遍扫描时,在余下的记录中,再选出具有最小关键字的记录需要比较次,第扫描时,在最后的个记录中,比较次选出最小关键字的记录。
算法举例第趟第二趟第三趟第四趟第五趟!冒泡排序冒泡排序的思路很简单,将相邻两个数组元素进行比较,将小的调整到前面。
排序过程比较第个数与第二个数,若为逆序,则交换然后比较第二个数与第三个数依次类推,直至第个数和第个数比较为止第趟冒泡排序,结果最大的数被安置在最后个元素位置上对前个数进行第二趟冒泡排序,结果使次大的数被安置在第个元素位置重复上述过程,经趟冒泡排序后,排序结束堆排序堆排序是在选择排序的基础上发展起来的。
它比选择排序的效率要高。
在堆排序中,把待排序的文件逻辑上看作是棵顺序二叉树,并用到堆的概念。
在介绍堆排序之前,先引入堆的概念。
我们回忆下,棵有个结点的顺序二叉树可以用个长度为的向量维数组来表示反过来,个有个记录的顺序表示的文件,在概念上可以看作是棵有个结点即记录的顺序二叉树。
例如,个顺序表示的文件可以看作为图所示的顺序二叉树。
当我们把顺序表示的文件,看作为顺序二叉树时,由顺序二叉树的性质可知记录,则的左孩子不存在的右孩子是记录,但若,则的右孩子不存在。
什么是堆呢堆是个具有这样性质的顺序二叉树,每个非终端结点记录的关键字大于等于它的孩子结点的关键字。
例如,图所示的顺序二叉树就是个堆。
显然,在个堆中,根结点具有最大值指关键字,下同,而且堆中任何个结点的非空左右子树都是个堆,它的根结点到任叶子的每条路径上的结点都是递减有序的。
堆排序的基本思想是首先把待排序的顺序表示维数组的文件,在概念上看作棵顺序二叉树,并将它转换成个堆。
这时,根结点具有最大值,删去根结点,然后将剩下的结点重新调整为个堆。
反复进行下去,直到只剩下个结点为止。
堆排序的关键步骤是如何把棵顺序二叉树调整为个堆。
初始状态时,结点是随机排列的,需要经过多次调整才能把它转换成个堆,这个堆叫做初始堆。
建成堆之后,交换根结点和堆的最后个结点的位置,相当于删去了根结点。
同时,剩下的结点除原堆中的根结点又构成棵顺序二叉树。
这时,根结点的左右子树显然仍都是个堆,它们的根结点具有最大值除上面删去的原堆中的根结点。
把这样棵左右子树均是堆的顺序二叉树调整为新堆,是很容易实现的。
例如,对于图所示的堆,交换根结点和最后的结点之后,便得到图所示的顺序二叉树除之外。
现在,新的根结点是,其左右子树仍然都是堆。
下面讨论如何把这棵二叉树调整为个新堆。
由于堆的根结点应该是具有最大值的结点,且已知左右子树是应的队列中个位数为的关键字,其记录依次放入号队列中个位数为的关键字,其记录放入号队列中个位数为的关键字,其记录放入号队列中。
这过程叫做按个位数分配。
现在把这个队列中的记录,按号,号,号队列的顺序收集和排列起来,同队列中的记录按先进先出的次序排列。
这是第遍。
第遍排序使用同样的办法,将第遍排序后的记录按其关键字的十位数第位分配到相应的队列中,再把队列中的记录收集和排列起来。
继续进行下去。
第遍排序时,按第遍排序后记录的关键字的最高位第位进行分配,再收集和排列各队列中的记录,医得到了原文件的有序文件,这就是以为基的关键字的基数排序法。
关键字初始状态个队列关键字第遍,按个位数分配收集后收集后第二遍,按十位数分配例如,给出关键字序列其中关键字用个在的前面补足到位,余关键字均为位的正整数。
进行基数排序的过程如图所示。
在这个例子中,文件和所有的队列都表示成向量维数组。
显然,关键字的位有可能均为同个数字例如,个数都为,这时所有的记录都同时装入同个队列中例如,同时装入号队列中。
因此,如果每个队列的大小和文件大小相同,则需要个倍于文件大小的附加空间。
此外,排序时需要进行反复的分配和收集记录。
所以,采用顺序表示是不方便的。
基数排序所需的计算时间不仅与文件的大小有关,而且还与关键字的位数关键字的基有关。
设关键字的基为十进制数的基为,二进制数的基为,为建立个空队列所需的时间为。
把个记录分放到各个队列中并重新收集起来所需的时间为,因此遍排序所需的时间为。
若每个关键字有位,则总共要进行遍排,所以基数排序的时间复杂度为。
由于关键字的位数直接与基数以及最大关键字的值有关,因此不同的和关键字将需要不同的时间。
在已介绍的上述各种内部排序方法中,就所需要的计算时间来看,快速排序归并排序堆排序是很好的方法。
但是,归并排序需要大小为的辅助空间,快速排序需要个栈空。
