-
对一千万个整数排序,整数范围在[-1000,1000]间,用什么排序最快?
在以上的情景下最好使用计数排序,计数排序的基本思想为在排序前先统计这组数中其它数小于这个数的个数,其时间复杂度为O(n+k),其中n为整数的个数,k为所有数的范围,此场景下的n>>k,所以计数排序要比其他基于的比较排序效果要好。 -
堆排序的思想
将待排序的序列构成一个大顶堆(从右往左对每一个非叶子节点进行调整),这个时候整个序列的最大值就是堆顶的根节点,将它与末尾节点进行交换,然后末尾变成了最大值,然后剩余n-1个元素重新构成一个堆,这样得到这n个元素的次大值,反复进行以上操作便得到一个有序序列。 -
冒泡排序
def bubble_sort(lst):
count=len(lst)
for i in range(0,count):
for j in range(i,count):
if lst[i]>lst[j]:
lst[i],lst[j]=lst[j],lst[i]
-
快速排序的最优情况
快速排序的最优情况是Partition每次划分的都很均匀,当排序的元素为n个,则递归树的深度为logn+1。在第一次做Partition的时候需对所有元素扫描一遍,获得的枢纽元将所有元素一分为二,不断的划分下去直到排序结束,而在此情况下快速排序的最优时间复杂度为nlogn。
快速排序博客 -
抽了两道面试题目两道。8个球,1个比较重,天平,几步找到重的?
两次
分为332.先一边三个球放在天平两边,如果天平是平的,则将剩下的两个球放在天平两两边,找出重的;如果一边三个球放在天平两边,天平不平,则从重的那一侧的三个球中选出两个球,放到天平两边,如果天平水平,则第三个球为重球,否则通过天平不平,则可判断出重球 -
topK给出3种解法
- 冒泡排序:每一次排序都可以确定一个值
时间复杂度:O(kn), 空间复杂度:O(k)
空间复杂度就是在交换元素时那个临时变量所占的内存空间. - 最小堆排序
取出K个元素建堆,对剩下的元素进行遍历,如果遍历值大于堆顶值,则替换堆顶值并调整为最小堆,遍历完所有值后堆中的元素即为topK.
时间复杂度:O(KlogK+(N-K)logK)=O(NlogK)
空间复杂度:O(K) - 分治法及快速排序
思路:
1)比如有10亿的数据,找处Top1000,我们先将10亿的数据分成1000份,每份100万条数据。
2)在每一份中找出对应的Top 1000,整合到一个数组中,得到100万条数据,这样过滤掉了999%%的数据。
3)使用快速排序对这100万条数据进行”一轮“排序,一轮排序之后指针的位置指向的数字假设为S,会将数组分为两部分,一部分大于S记作Si,一部分小于S记作Sj。4)如果Si元素个数大于1000,我们对Si数组再进行一轮排序,再次将Si分成了Si和Sj。如果Si的元素小于1000,则我们需要在Sj中获取1000-count(Si)个元素的,也就是对Sj进行排序
5)如此递归下去即可获得TopK。
时间复杂度:一份获取前TopK的时间复杂度:O((N/n)logK)。则所有份数为:O(NlogK),但是分治法我们会使用多核多机的资源,比如我们有S个线程同时处理。则时间复杂度为:O((N/S)logK)。之后进行快排序,一次的时间复杂度为:O(N),假设排序了M次之后得到结果,则时间复杂度为:O(MN)。所以 ,总时间复杂度大约为O(MN+(N/S)logK) 。
空间复杂度:需要每一份一个数组,则空间复杂度为O(N)。