×

堆排序 排序

什么是堆排序?冒泡排序法是什么

admin admin 发表于2022-05-03 16:30:13 浏览112 评论0

抢沙发发表评论

什么是堆排序

【概念】堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]] 》= A[i]。在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。【起源】1991年的计算机先驱奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德(Robert W.Floyd)和威廉姆斯(J.Williams)在1964年共同发明了著名的堆排序算法( Heap Sort )。【简介】堆排序利用了大根堆(或小根堆)堆顶记录的关键字最大(或最小)这一特征,使得在当前无序区中选取最大(或最小)关键字的记录变得简单。(1)用大根堆排序的基本思想① 先将初始文件R[1..n]建成一个大根堆,此堆为初始的无序区② 再将关键字最大的记录R(即堆顶)和无序区的最后一个记录R[n]交换,由此得到新的无序区R[1..n-1]和有序区R[n],且满足R[1..n-1].keys≤R[n].key③由于交换后新的根R可能违反堆性质,故应将当前无序区R[1..n-1]调整为堆。然后再次将R[1..n-1]中关键字最大的记录R和该区间的最后一个记录R[n-1]交换,由此得到新的无序区R[1..n-2]和有序区R[n-1..n],且仍满足关系R[1..n-2].keys≤R[n-1..n].keys,同样要将R[1..n-2]调整为堆。……直到无序区只有一个元素为止。(2)大根堆排序算法的基本操作:①建堆,建堆是不断调整堆的过程,从len/2处开始调整,一直到第一个节点,此处len是堆中元素的个数。建堆的过程是线性的过程,从len/2到0处一直调用调整堆的过程,相当于o(h1)+o(h2)…+o(hlen/2) 其中h表示节点的深度,len/2表示节点的个数,这是一个求和的过程,结果是线性的O(n)。②调整堆:调整堆在构建堆的过程中会用到,而且在堆排序过程中也会用到。利用的思想是比较节点i和它的孩子节点left(i),right(i),选出三者最大(或者最小)者,如果最大(小)值不是节点i而是它的一个孩子节点,那边交互节点i和该节点,然后再调用调整堆过程,这是一个递归的过程。调整堆的过程时间复杂度与堆的深度有关系,是lgn的操作,因为是沿着深度方向进行调整的。③堆排序:堆排序是利用上面的两个过程来进行的。首先是根据元素构建堆。然后将堆的根节点取出(一般是与最后一个节点进行交换),将前面len-1个节点继续进行堆调整的过程,然后再将根节点取出,这样一直到所有节点都取出。堆排序过程的时间复杂度是O(nlgn)。因为建堆的时间复杂度是O(n)(调用一次);调整堆的时间复杂度是lgn,调用了n-1次,所以堆排序的时间复杂度是O(nlgn) 注意:①只需做n-1趟排序,选出较大的n-1个关键字即可以使得文件递增有序。②用小根堆排序与利用大根堆类似,只不过其排序结果是递减有序的。堆排序和直接选择排序相反:在任何时刻堆排序中无序区总是在有序区之前,且有序区是在原向量的尾部由后往前逐步扩大至整个向量为止【特点】堆排序(HeapSort)是一树形选择排序。堆排序的特点是:在排序过程中,将R[l..n]看成是一棵完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系(参见二叉树的顺序存储结构),在当前无序区中选择关键字最大(或最小)的记录【算法分析】堆排序的时间,主要由建立初始堆和反复重建堆这两部分的时间开销构成,它们均是通过调用Heapify实现的。平均性能:O(N*logN)。其他性能:由于建初始堆所需的比较次数较多,所以堆排序不适宜于记录数较少的文件。堆排序是就地排序,辅助空间为O(1)。它是不稳定的排序方法。(排序的稳定性是指如果在排序的序列中,存在前后相同的两个元素的话,排序前 和排序后他们的相对位置不发生变化)。

冒泡排序法是什么

 冒泡排序的英文Bubble Sort,是一种最基础的交换排序。

  大家一定都喝过汽水,汽水中常常有许多小小的气泡,哗啦哗啦飘到上面来。这是因为组成小气泡的二氧化碳比水要轻,所以小气泡可以一点一点向上浮动。而我们的冒泡排序之所以叫做冒泡排序,正是因为这种排序算法的每一个元素都可以像小气泡一样,根据自身大小,一点一点向着数组的一侧移动。

冒泡排序算法的原理如下:

  • 比较相邻的元素。如果第一个比第二个大,就交换他们两个。

  • 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

  • 针对所有的元素重复以上的步骤,除了最后一个。

  • 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

  • 具体如何来移动呢?让我们来看一个栗子:

    请点击输入图片描述

    有8个数组成一个无序数列:5,8,6,3,9,2,1,7,希望从小到大排序。按照冒泡排序的思想,我们要把相邻的元素两两比较,根据大小来交换元素的位置,过程如下:

    首先让5和8比较,发现5比8要小,因此元素位置不变。

    接下来让8和6比较,发现8比6要大,所以8和6交换位置。

    请点击输入图片描述

    请点击输入图片描述

    继续让8和3比较,发现8比3要大,所以8和3交换位置。

    请点击输入图片描述

    请点击输入图片描述

    继续让8和9比较,发现8比9要小,所以元素位置不变。

    接下来让9和2比较,发现9比2要大,所以9和2交换位置。

    请点击输入图片描述

    请点击输入图片描述

    接下来让9和1比较,发现9比1要大,所以9和1交换位置。

    请点击输入图片描述

    请点击输入图片描述

    最后让9和7比较,发现9比7要大,所以9和7交换位置。

    请点击输入图片描述

    请点击输入图片描述

    这样一来,元素9作为数列的最大元素,就像是汽水里的小气泡一样漂啊漂,漂到了最右侧。

    这时候,我们的冒泡排序的第一轮结束了。数列最右侧的元素9可以认为是一个有序区域,有序区域目前只有一个元素。

    请点击输入图片描述

    下面,让我们来进行第二轮排序:

    首先让5和6比较,发现5比6要小,因此元素位置不变。

    接下来让6和3比较,发现6比3要大,所以6和3交换位置。

    请点击输入图片描述

    请点击输入图片描述

    继续让6和8比较,发现6比8要小,因此元素位置不变。

    接下来让8和2比较,发现8比2要大,所以8和2交换位置。

    请点击输入图片描述

    接下来让8和1比较,发现8比1要大,所以8和1交换位置。

    请点击输入图片描述

    请点击输入图片描述

    继续让8和7比较,发现8比7要大,所以8和7交换位置。

    请点击输入图片描述

    请点击输入图片描述

    第二轮排序结束后,我们数列右侧的有序区有了两个元素,顺序如下:

    请点击输入图片描述

    至于后续的交换细节,我们这里就不详细描述了,第三轮过后的状态如下:

    请点击输入图片描述

    第四轮过后状态如下:

    请点击输入图片描述

    第五轮过后状态如下:

    请点击输入图片描述

    第六轮过后状态如下:

    请点击输入图片描述

    第七轮过后状态如下(已经是有序了,所以没有改变):

    请点击输入图片描述

    第八轮过后状态如下(同样没有改变):

    请点击输入图片描述

    到此为止,所有元素都是有序的了,这就是冒泡排序的整体思路。

    原始的冒泡排序是稳定排序。由于该排序算法的每一轮要遍历所有元素,轮转的次数和元素数量相当,所以时间复杂度是O(N^2) 。

    冒泡排序代码

希望对您有所帮助!~

冒泡排序法

1、冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。2、它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故名。冒泡排序算法的运作如下:(从后往前)1、比较相邻的元素。如果第一个比第二个大,就交换他们两个。2、对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。3、针对所有的元素重复以上的步骤,除了最后一个。4、持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。