0514数据结构--递归、排序和查找

1.汉诺塔算法

实现这个算法可以简单分为三个步骤:
 (1) 把n-1个盘子由A 移到 B;
 (2) 把第n个盘子由 A移到 C;
 (3) 把n-1个盘子由B 移到 C;
从这里入手,在加上上面数学问题解法的分析,我们不难发现,移到的步数必定为奇数步:
 (1)中间的一步是把最大的一个盘子由A移到C上去;
 (2)中间一步之上可以看成把A上n-1个盘子通过借助辅助塔(C塔)移到了B上,
 (3)中间一步之下可以看成把B上n-1个盘子通过借助辅助塔(A塔)移到了C上;

时间复杂度:n个盘子,需要移动2^n-1次,所以时间复杂度为O(2^n)

递归调用时系统所做的工作:

一个函数在调用另一个函数之前,运行被调函数是,需要进行(1)将所有实参、返回地址等信息传递给被调用函数保存(2)为被调用函数分配局部变量存储区(3)将控制转移到被调用函数的入口

从被调用函数返回给调用函数之前,需要进行:(1)保存被调用函数的结果(2)释放被调用函数的数据区(3)依照被调用函数保存的返回地址将控制转移到调用函数的间断点

2.快排序算法

算法思想:采用分治思想,在记录中确定一个基准数据,然后将记录中的数据和基准元素对比,将记录分为比基准元素大和基准元素小的两部分。然后进行递归的方法,分别对分成的两部分进行重复的划分操作,直到数据有序为止。每一次划分的过程可以是确定第一个元素为基准元素,然后使用两个指针,分别从记录的末尾和开头进行和基准元素的比较,比他大就放在右边,比他小的放在左边,最后将基准元素放在这两组数据的中间。因为所有的元素都需要和基准元素进行比较,所以每一次划分需要比较n次,而且每次分成两部分,需要logn次的划分,所以快速排序的时间复杂度为O(nlogn),空间复杂度是O(logn)。但是如果这一组记录是逆序的,每次采取第一个数字为基准数字的话,快排算法就会退化成为冒泡排序算法,时间复杂度就会变成O(n^2)。最后,快速排序是一种不稳定的算法。

3.归并排序

算法思想:归并排序采用分治的思想,将数据分为若干个组,每个组排序之后再进行合并。时间复杂度是O(nlogn),空间复杂度根据分组进行合并时所使用的额外空间确定,最大是O(n)。

4.堆排序算法

首先,堆是一种特殊的完全二叉树,可以使用数组存储。堆分为大顶堆和小顶堆,大顶堆即树中的每一个父结点都比他的两个子结点的值要大,小顶堆相反。以大顶堆为例,堆的基本操作从上向下调整和从下向上调整,从上向下调整就是将结点和他的子结点进行比较和交换,把小的值往下调整。从下向上调整将一个结点的值和他的子结点进行比较和交换,把大的值向上调整。

堆排序的基本思想是:将待排序序列使用向上调整的操作不断进行调整构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素使用向下调整的操作重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列了。

构造堆的时间复杂度是O(n),调整的时间复杂度是O(logn),堆排序的时间复杂度是O(nlogn),空间复杂度是O(1)。

堆排序和快排的比较:

(1)对于快速排序,数据是连续访问的,而对于快排序来说数据是跳着访问的,因此堆排序对于CPU的缓存是不友好的。

(2)同样的数据,堆排序的数据交换次序要多于快速排序。

堆排序的应用:

找TOP K元素

优先级队列(如下)

5.给定一组数据,数据元素的权值依次为(4,11,7,8,1,0,5,3,9)

(1)设计权值最小优先的优先级队列的构造算法.构造小顶堆。

(2)设计该优先级队列的而输出算法,并说明输出了之后的数组中剩余各元素的位置。

6.线性排序(排序算法的时间复杂度是线性的,都为O(n))

桶排序:将要排序的数据分到几个有序的桶里面,每个桶内的数据再进行排序,这样按序将每个桶里面的数据依次取出,桶里面的数据就是有序的了。假设要排序的数据有n个,有m个桶,每个桶内就是n/m个数据,每个桶内使用快排算法排序,那么每个桶排序的时间复杂度就是n/m*lon(n/m),m个桶就是n*log(n/m),当桶的个数非常接近数据个数时,lon(n/m)就是一个很小的数据了,此时桶排序的时间复杂度就约等于O(n)。当然,虽然时间复杂度为O(n),但是桶排序对于排序数据的要求是非常苛刻的,首先,要排序的数据需要很容易就划分成n个桶,其次,数据在每个桶内是均匀的。桶排序适合外部排序。

计数排序:桶排序的一种特殊情况。数据范围不大时,可以按数据范围划分桶的个数,在每个桶中放入相同的数据。比如统计成绩分数排名。

基数排序:按照每一位来进行排序。

7.二分查找

首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

时间复杂度O(logn)

8.哈希算法

 哈希算法即将任意长度的二进制值串映射为固定长度的二进制串,而通过原始数据映射之后得到的二进制串就是哈希值。

猜你喜欢

转载自www.cnblogs.com/helloworldToDu/p/12859317.html