来自:滴滴出行2016研发工程师笔试题
题目:下述几种排序方法中,要求内存最大的是()
A. 快速排序
B. 插入排序
C. 选择排序
D. 归并排序
下面是分析:
A. 快速排序和归并排序都是属于较快排序算法,对于特别大的数组,需要用这些算法。快速排序使用了分而治之的思想。这个算法所需要的空间复杂度(内存)是O(log2N) ~ O(N)。 (by the way,数字2是log的底数)。由于快速排序是递归,需要用一个栈来存放每一层递归调用的信息,其最大容量应与递归调用的深度一致。最好的情况下是O(log2N);最坏的情况下,因为要进行n-1次递归调用,所以就是O(N)。用递归来做快速排序时有点想二叉搜索树的前序遍历(根,左,右)。
B. 插入排序的空间复杂度是O(1)。
C. 选择排序的空间复杂度是O(1)。
D. 归并排序的空间复杂度是O(N),因为归并排序需要一个与原始数组大小相等的辅助数组。所以答案就是D
BY THE WAY, 考虑到一些同学没见到过这些算法,我就好人做到底吧,介绍选项中的四个排序算法。
快速排序,英文名叫Quick Sort。快速排序是对冒泡排序的一种改进,改进的是从两端向中间进行移动的,关键码较大的就能从前面移动到后面,关键码较小的从后面移动到前面,这样就减少了总的比较次数和移动次数。
思想:
第一,首先选一个轴值(povit),将待排序记录划分成独立的两部分,左侧记录的关键码均小于或等于轴值,右侧记录的关键码均大于或等于轴值。
第二,分别对这两部分重复上述过程,直到整个序列有序。
插入排序,英文名叫Insertion Sort。
思想:
第一,将整个待排序的记录序列划分成有序区和无序区。
第二,将无序区的第一个记录插入到有序区的合适位置中,从而使无序区减少一个记录,这样有序区就增加一个记录。
第三,重复执行第二步,until到无序区没有数字为止
选择排序,英文名叫Selection Sort。
思想:
就是找数组中的最大值插入到最后一个位置,然后忽略最后一个位置,将第二大的数字插入到倒数最后第二个位置,这样循环做到把所有数字排完序列。
归并排序,英文名叫Merge Sort。
思想:
归并排序需要一个与原始数组大小相等的辅助数组。
将数组分成两个部分,递归地排序每一部分,然后将两部分归并。
希望这篇文章对您有所帮助!!