数据结构 排序

来源:互联网 发布:中邮网络培训学院官网 编辑:程序博客网 时间:2024/06/06 09:21

1 对n个数字进行排序,期中两两不同的数字的个数为k,n远远大于k,而n的取值区间长度超过了内存的大小,时间复杂度最小可以是?

两两不同的数字的个数为k,因为不知道确定的数字范围,桶排序不适合,又因为 n远远大于k, 本题使用hash表来统计,首先获得k个数及其每个数出现的次数,然后对k个数进行排序,排序的 复杂度可忽律不计,实际上就是遍历一遍n个数字,所以本位复杂度为O(n)。

2 已知数组元素基本有序的情况下,下面采用那个算法对数组排序时间复杂度最低()

直接选择排序
堆排序
快速排序
插入排序
因为数组元素,基本有序,所以快速排序是最慢的,因为会退化成冒泡排序
选择排序时间复杂度都是O(n^2),堆排序都是O(nlogn),但是基本有序对插入排序是最好的
因为这样只需要比较大小,不需要移动,时间复杂度趋近于O(n)

3 n个数值选出最大m个数(3<m<n)的最小算法复杂度是

O(n)
O(nlogn)
O(logn)
O(mlogn)
O(nlogm)
O(mn)
剑指offer第30题
1.最简单的方法:将n个数排序,排序后的前k个数就是最大的k个数,这种算法的复杂度是O(nlogn)
2.O(n)的方法:利用快排的patition思想,基于数组的第k个数来调整,将比第k个数小的都位于数组的左边,比第k个数大的都调整到数组的右边,这样调整后,位于数组右边的k个数最大的k个数(这k个数不一定是排好序的)
3.O(nlogk)的方法:先创建一个大小为k的最小堆,接下来我们每次从输入的n个整数中读入一个数,如果这个数比最小堆的堆顶元素还要大,那么替换这个最小堆的堆顶并调整。
4 一组记录排序码为(5 11 7 2 3 17),则利用堆排序方法建立的初始堆为

(11 5 7 2 3 17)
(11 5 7 2 13 3)
(17 11 7 2 3 5)
(17 11 7 5 3 2)
(17 7 11 3 5 2)
(17 7 11 3 2 5)

------------在排序方法中,元素比较次数与元素的初始排列无关的是()

Shell 排序
归并排序
直接插入排序
选择排序

我能肯定的是D,但是不理解B。我仔细想了一下。

关于归并可以这么解释。首先归并排序中 merge的任务是把两个有序数组合并为一个有序数组。假设A,和B为两个有序数组,合并为一个有序数组C,最好情况比较n/2次(n为数组C的长度,假设数组A和数组B等长,都为n/2),这种情况的前提条件是数组A中最小的元素比数组B中最大的元素要大。那么只要A[0]和B中所有元素都比较过一遍以后,数组A中的其他元素就不用比较了,所以比较了n/2次。最坏情况元素错落,A[0]和B[0]比,假设得出A[0]以后,A[0]先和B[1]比,B[1]再和A[1]比,A[1]再和B[2]比..........那就是n-1次。不知道自己分析的对不对,还是有点疑惑。我的疑惑是归并算法它的时间复杂度不管最好最坏都是一样的O(nlogn),它和比较次数难道没有关系吗?求大神回答。

n/2和n-1在计算复杂度的时候算作一个数量级n


有关选择排序的叙述中正确的是(      )
正确答案 : AD您的答案 : BD
A每扫描一遍数组,只需要一次交换B每扫描一遍数组,需要多次交换C选择排序是稳定的排序方法D空间复杂度为O(1)

1、有关选择排序的叙述正确的有:
(1)每扫描一遍数组,只需要一次交换。
(2)空间复杂度为O(1)。
(3)选择排序是不稳定的排序算法。

2、常见的稳定的排序算法有:
(1)直接插入排序;
(2)冒泡排序;
(3)归并排序;
(4)基数排序。

3、常见的不稳定的排序算法有:
(1)简单选择排序;
(2)希尔排序;
(3)快速排序;
(4)堆排序。
关于堆排序复杂度分析的叙述中正确的是(      )
正确答案 : ABCD您的答案 : ACD
A堆排序的时间复杂度为O(nlogn)B整个构建堆的时间复杂度为O(n)C堆排序的空间复杂度为O(1)D堆排序是一种不稳定的排序算法

关于堆排序复杂度分析叙述正确的有:
(1)堆排序的时间复杂度为O(nlogn);
(2)整个构造堆的时间复杂度为O(n);
(3)堆排序的空间复杂度为O(1);
(4)堆排序是一种不稳定的排序算法。

原创粉丝点击