【程序员笔试面试必会——排序③】高频笔试题、知识点
一、小范围排序 题目: 已知一个 几乎有序 的数组,几乎有序是指,如果把数组排好顺序的话,每个元素移动的距离要小于k,并且k相对于数组来说比较小。请选择一个合适的排序算法针对这个数据进行排序。 给定一个int数组 A ,同时给定A的大小 n 和题意中的 k ,请返回排序后的数组。 测试样例: [2, 1, 4, 3, 6, 5, 8, 7, 10, 9], 10, 2 返回:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 思路: 首先看一下 时间复杂度O(N)的算法,如:计数排序、基数排序,但因为我们不知道数组的范围,所以这些算法就不去考虑了。 然后看一下时间复杂度O(N^2)的算法,如:冒泡排序、选择排序,这两个排序算法是无论要排序的序列是什么顺序,时间复杂度都是严格的O(N^2)。 插入排序 ,这里可以做到很好的程度,因为插入排序的过程与原始顺序有关,每个移动距离不超过k,对本题来说,插入排序的时间复杂度是不会高于O(N*k)。 最后看一下时间复杂度O(N*logN)的算法,如:快速排序,快速排序与原始数据顺序也是无关的,快速排序是随机选一个数,以这个数对整个数组进行划分,划分出来的两个部分再分别进行递归。归并排序,也是与原始数据顺序无关的,归并排序是把所有的组都打散,然后小组合大组,大组再合更大的组,最后使整个数组有序。