算法与数据结构1800题

A
堆的特性:
1,必须符合完全二叉树,插入节点插入在末尾
2,堆可以存放在数组中,按照层序遍历存放
3,根节点,一定同时小于(大于)两个子节点,而不是小于左边的大于右边的,或者相反
4,节点的插入,直接插入在末尾,然后动态调整,只需要向上调整即可,类似于冒泡排序

B
冒泡排序:待排序元素两两比较,逆序交换,每趟有一个元素到达底部
插入排序:先假定第一个匀速有序,从第二个元素开始算作第一趟,每趟将一个元素插入到有序序列中,一趟插一个,第一个元素不算作一趟
选择排序,从第一个元素,一次与后面的所有元素画括号,从括号内选择出最小的(最大的),然后与括号内第一个元素交换,依次后退从而完成排序,时间复杂度N^2
二路归并排序:第一趟:两两归并,44归并,88归并等 希尔排序,间隔版插入排序(希尔排序是先按照步长进行分组,组内进行插入排序,逐渐减少步长,最后步长为1进行一趟直接插入排序)
快速排序:每次选一个中枢点,然后使得比中枢点小的都在左边,比中枢点大的都在右边,然后采用递归的方式,对中枢点左侧和右侧的数组,分别进行上述的快速排序(选择中枢点,然后使得左边的小于右边的) 堆排序:建堆,每次从堆中选择最小值,然后堆利用本身的高效调整性质进行调整

D

快速排序的递归次数等于递归树的高度

递归树的高度,取决于轴中枢的选择,越均分,树高度越小,递归深度越小
每次划分后,对长短分区的处理顺序,不会影响到递归树的高度,也就不会影响到递归次数,对长短分区的处理顺序会影响到堆栈的使用内存,先处理短的分区,可以减小堆栈的深度
递归次数,与划分分区后的处理顺序无关

A

快速排序适合使用顺序存储(双向链表也可以)

B
堆在插入节点之后,需要进行调整,只需要与父节点进行比较即可,如果大小异常,就进行交换,如果如果经过入干次调整之后,发现正常了,还需要进行一次大小比较,发现正常,然后就不进行交换了
本题:进行两次比较,一次交换
堆,按照完全二叉树的层次遍历法进行存储和构建

A

D 简单直接插入排序与折半插入排序的比较
在简单直接插入排序的算法中,在每趟插入的过程中,都进行了两项工作: 1,从前面的有序表中从尾到前一个一个的比较,以找到带插入的位置 2,边比较,边移动元素
折半插入,采用的是先使用二分法找到待插入的位置,然后再统一移动元素进行插入的方法
区别:仅仅是减少了比较元素的次数,该次数与待排序表的初始装太无关,仅仅取决于表中的元素个数,元素的移动次数没有改变,折半插入的时间复杂度仍然为N^2 直接插入排序,和折半插入排序是稳定的,希尔排序是不稳定的 排序的总趟数不变,一次排序一个,一共N次
移动次数不变
辅助空间不变,直接插入,折半插入,希尔排序,辅助空间都是O(1)
时间复杂度:希尔排序,直接插入和折半插入,最坏复杂度都是O(N^2),只有希尔排序的平均时间复杂度是O(N^d),其余两种的平均时间复杂度都是O(N^2)

C

C

C

直接插入排序,与初始序列的顺序有关: 如果是正确的序列,直接插入就好,不需要移动
冒泡排序:如果已经是有序的了,就不需要进行移动
基数排序,无论是不是有序,都要按照从低位到高位进行排序,重新排序
快速排序,如果是完全逆序,而且pivot取为首元素,则需要大量移动,反之则不需要进行移动

本题过程: 正确答案:3次比较

A 希尔排序的组内排序,采取的是直接插入排序,并且无法使用折半插入排序

A

选择排序,以及选择排序的改进型堆排序,都是不稳定的
冒泡排序,插入排序(折半插入),都是稳定的,他们的改进型快速排序和希尔排序,都是不稳定的
归并排序和基数排序,都是稳定的
三种基本排序法中,只有选择排序是不稳定的
三中改进排序法中,全部都是不稳定的
两种特殊排序(归并排序和基数排序)都是稳定的

D

B

B

D

CE

实数是有理数与无理数的总称,基数排序适用于整数,如2进制,10进制等,不适用于实数
A

C 平均时间复杂度为O(N*logN)的,只有堆排序,快速排序,归并排序(记忆方法,堆的高度是logN,快排和归并都是递归,使用了2^N,所以也是logN,基数排序与希尔排序,与2^N无关)
三种简单排序(选择,冒泡,插入,平均时间复杂度和最坏时间复杂度都是N^2)

CDF
简单排序都是稳定的,除了选择排序
改进排序都是不稳定的
基数排序和归并排序是稳定的

比较次数与序列初始状态无关:
快速排序,与序列初始状态是有关的
直接插入排序:有关,如果直接有序的话,基本不需要比较
归并排序,无论是否有序,都需要进行22比较,44比较等,
简单选择排序:划括号,然后从中选择最大值,比较次数只与个数n有关,而与是否有序无关
冒泡排序:算法里面设立了flag , 如果有序的话,经过一次冒泡,没有发生元素的交换,就直接退出了循环, 所以与初始状态下的序列有关
堆排序,不清楚
总结: 三种基本排序以及三种改进型中,只有简单选择以及二路归并排序的比较次数,与初始序列状态无关,其余的几种都有关 初始序列已经基本有序,排序效率最高的是插入排序

排序趟数与原始状态无关的排序方法:
选择排序, 直接插入,希尔排序,折半插入,归并排序(必须是那么多次),基数排序
排序趟数与原始状态有关的排序方法:
冒泡排序,堆排序,快速排序(一次固定一个位置)

比较次数与初始状态无关的是:
选择排序,折半插入,归并排序,基数排序
比较次数与初始状态有关的是:
冒泡排序,直接插入,希尔排序,堆排序(不太明白,估计是建堆的时候,有序的比较好建),快速排序

A
对于简单选择排序,无论是否有序,都必须要从括号中从头选到尾
对于直接插入排序,插入一个元素之后,是从后向前比较,如果有序的话,直接插入,比较一次就好,不需要继续向前比较了,所以与初始序列的有序性有关
快速排序,如果初始排序比较均匀,反而会变慢
堆排序,初始排序越均匀,建堆越快,需要的比较次数越少,所以与初始序列的有序性有关

快速排序的关键字比较次数,与初始序列的有序性有关,最坏情况,时间复杂度为N^2,平均情况下为O(N^logN);

BD
简单直接插入,与折半插入之间的关系:选择好要插入的元素之后,在搜索待插入位置的时候,一个是从后到前一个一个的比较,另一个是采用二分法进行比较
如果采用简单直接插入,对于有序序列比较方便,如果采用二分法插入,则与初始序列是否有序无关

D

由于时间复杂度等同于比较次数,所以本题等同于,哪一个算法的比较次数与初始排列是否有序无关

转载于:https://juejin.im/post/5b9618ce5188255c57211fb8

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值