####13、例题
13.1 小范围排序 已知一个几乎有序的数组,几乎有序是指,如果把数组排好顺序的话,每个元素移动的举例不超过k,并且k相对于数组长度来说很小。请问选择什么方法对其排序比较好。 计数排序、基数排序:不基于比较的排序算法的限制,不适用所有情况 冒泡排序、选择排序:这两个排序算法与数组原始序列无关 插入排序:插入排序的过程与原始顺序有关,每个元素移动距离不超过K 快速排序,归并排序:与数组原始顺序无关 答案:改进后的堆排序O(N*logK)
13.2 判断数组中是否有重复值。必须保证额外空间复杂度为O(1) 如果没有空间复杂度限制,用hash表实现 时间复杂度O(N),空间复杂度为O(N) 先排序,然后判断,空间复杂度为O(1),要选堆排序,但需要改进版本的堆排序
13.3把两个有序数组合为一个数组。第一个数组空间正好可以容纳两个数组的元素。 数字A 2 4 6 _ _ _ (从后往前覆盖) 数字B 1 3 5
13.4 荷兰国旗问题。只包含0,1,2的整数数组进行排序,要求使用交换、原地排序,而不是利用计数进行排序。 答:与快排的原理类似。 在前面设一个0区域,后面设一个2区域,然后指针中内容与之比较。当前位置与2区域重合的时候,整个过程停止。
13.5 在行列都排好序的矩阵中找数 0 1 2 5 2 3 4 7 4 4 4 8 5 7 7 9 如果k为7,返回true;如果k为6,返回false 答:从二维数组的右上角开始找,如果要找的数比自己大,到下面找,如果比自己数小,到左边找。
13.6 需要排序的最短子数组长度[1,5,4,3,2,6,7],返回4,因为只有[5,4,3,2]需要排序。 答:从左往右遍历,只关注遍历后的最大值,记录下面,关注被比起小的值,记录最右位置的数。再从右往左遍历,只关注遍历后的最小值,记录比其大的值,记录最左位置的数。两者范围就是需要遍历的组。
13.7 给定一个整型数组arr,返回如果排序之后,相邻两数的最大差值。 例如:某数组排序之后为 1 2 3 4 7 8 9 最大差值来自与4和7,所以返回3 答:思想来自桶排序,找最小值和最大值,等量的分为N个区间。只要记录两个桶之间最大值和最小值的差值。