前情提要
作者:wwhhyy
最近很长时间没有更新了,有朋友让我麻烦看一下他要考试科目的去年的试题,出于一个计算机人的好奇心,我看了下这份试卷的难度,并做了下这份试卷,发现还是非常具有挑战性的。而且可能和国内的数据结构算法的考试题的风格不太一样。那么在这里我就把这些题目分享给大家,希望能够给大家一点小小的帮助。
第一题A
问题:请描述归并排序的归并过程?以及归并排序的时间复杂度,还有如何计算出归并排序的时间复杂度
归并排序的归并过程,n个元素的数组,先把它分成两部分进行归并排序,然后就是归并过程
我们使用两个指针,指向这两个子数组,然后使用一个temp数组来存储我们归并过程中的排序好的数组,比较两个指针对应的数组的值的大小,把小的那个放入temp数组,然后把对应指针推移,直到两个指针都指向子数组的最后的地方。最后再把temp数组的值放入数组当中,完成归并排序
时间复杂度 O ( n l o g n ) O(nlogn) O(nlogn)
解释,计算表达式如下
T ( n ) = 2 T ( n / 2 ) + n T(n)=2T(n/2)+n T(n)=2T(n/2)+n
经过数学计算得到最终的时间复杂度
第一题的B
问题:请描述堆的定义,并且解释如何用堆来进行升序排序以及堆排序的时间复杂度和对应的解释。
堆的定义:
a heap is a specialized tree]-based data structure which is essentially an almost complete tree that satisfies the heap property: in a max heap, for any given C, if P is a parent node of C, then the key (the value) of P is greater than or equal to the key of C. In a min heap, the key of P is less than or equal to the key of C.
如何用堆来进行升序排序
我们用无序数组构建成一个最大堆,然后把第一个位置上的元素和堆末尾的元素对换,之后让堆的大小减一,之后把堆再次构建,重复上面过程,得到一个有序的升序数列
时间复杂度 O ( n l o g n ) O(nlogn) O(nlogn)
理由:每次构建堆的时间复杂度是logn,我们要构建n次堆,所以时间复杂度如上