面试常考察的排序(快速排序,归并排序,堆排序)
2014-12-03 17:20
357 查看
面试最经常考察的排序应该就是 快速排序,归并排序和堆排序了。
例如题目:10万个数字中找最大的10个数。
1,因为10万个数可以放到内存中,首先可以考虑使用快排的 Partition 函数解决这个问题。
若Partition 函数得到 index 值为 99990,则从下标 99990 到下标 99999 的10个数字就是最大的 10 个数。
时间复杂度为 O(n)。
使用前10个节点建立一个小根堆,然后继续遍历其余的所有数字。因为根据小根堆的性质,最小节点为根节点。如果遍历到的数字比小根堆根节点小,则直接忽略,该遍历到的数一定不是最大的10个数之一。若遍历到的数比小根堆的根节点值大,则用该节点直接替换小根堆根节点,再调整堆即可。这样仅需维护10个节点的小根堆即可。
。。。待续
例如题目:10万个数字中找最大的10个数。
1,因为10万个数可以放到内存中,首先可以考虑使用快排的 Partition 函数解决这个问题。
若Partition 函数得到 index 值为 99990,则从下标 99990 到下标 99999 的10个数字就是最大的 10 个数。
时间复杂度为 O(n)。
int Partition(int data[],int length,int start,int end) { if(data == NULL || length <=0 || start <0 || end >= length) return; int index = RandomInRange(start,end); Swap(&data[index],&data[end]); int small = start - 1; for (index = start;index < end;++index) { if(data[index] < data[end]) { ++small; if(small != index) Swap(&data[small],&data[index]); } } ++small; Swap(&data[small],&data[end]); return small; } void GetMaxNumbers(int* input,int n,int* output,int k) { if(input == NULL || output == NULL || n <= 0||k<=0||k>n) return; int start = 0; int end = n - 1; int index = Partition(input,n,start,end); while(index != (n-k)) { if(index < n-k) { start = index + 1; index = Partition(input,n,start,end); } else { end = index - 1; index = Partition(input,n,start,end); } } for(int i = n-k ;i < n;++i) { output[i] = input[i]; } }2 可以考虑使用堆排序的思想解决。此处考虑小根堆较为适合。
使用前10个节点建立一个小根堆,然后继续遍历其余的所有数字。因为根据小根堆的性质,最小节点为根节点。如果遍历到的数字比小根堆根节点小,则直接忽略,该遍历到的数一定不是最大的10个数之一。若遍历到的数比小根堆的根节点值大,则用该节点直接替换小根堆根节点,再调整堆即可。这样仅需维护10个节点的小根堆即可。
。。。待续
相关文章推荐
- 面试珠玑 快速排序、希尔排序、插入排序、选择排序、归并排序、堆排序总结
- 【程序员笔试面试必会——排序①】Python实现 冒泡排序、选择排序、插入排序、归并排序、快速排序、堆排序、希尔排序
- 笔试面试最常涉及到的12种排序算法(包括插入排序、二分插入排序、希尔排序、选择排序、冒泡排序、鸡尾酒排序、快速排序、堆排序、归并排序、桶排序、计数排序和基数排序)进行了详解。每一种算法都有基本介绍、算
- 面试珠玑 快速排序、希尔排序、插入排序、选择排序、归并排序、堆排序总结
- 排序算法的C++实现与性能分析(插入排序、归并排序、快速排序、STOOGE排序、堆排序)
- 排序之选择排序、堆排序、归并排序、快速排序
- 归并排序、快速排序、堆排序
- 其他三种排序:堆排序,归并排序,快速排序
- 【Java】八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序 、快速排序、归并排序、堆排序和LST基数排序
- Java实现快速排序、归并排序、堆排序和希尔排序
- 快速排序,归并排序,堆排序,基数排序,插入排序,希尔排序,
- 元素排序几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- 快速排序,插入排序,归并排序,计数排序,基数排序,堆排序
- 快速排序、堆排序、归并排序比较
- 快速排序 冒泡排序 归并排序 堆排序 的主要代码
- 插入排序、冒泡排序、选择排序、Shell排序、快速排序、归并排序、堆排序
- 七大内部排序算法总结(插入排序、希尔排序、冒泡排序、简单选择排序、快速排序、归并排序、堆排序)
- 其他三种排序:堆排序,归并排序,快速排序
- 八大排序算法:简单插入排序、冒泡排序、希尔排序、快速排序、堆排序、归并排序等总结。
- 直接插入排序,冒泡排序,快速排序,简单选择排序,堆排序,2-路归并排序,文件存储