微软面试题:三路划分快速排序---针对重复关键字的改进
来源:互联网 发布:java多线程发送短信 编辑:程序博客网 时间:2024/05/29 08:08
这是2012年微软实习生招聘的面试题,可惜的是本人没有通过,但是这道题当时是做出来了
题目:改写partition算法。要求:一次partition之后,小于基准元素key的数在左边,等于key的在中间,大于key的在右边
思路:参照算法导论上的思想,做出改进:i指向小于基准元素的序列的末尾,j指向等于基准元素的序列的末尾,k指向当前遍历到的元素,说到这里应该可以了
程序c++实现:
#include <iostream> #include <cstdlib> using namespace std; void print(int *arr, int start, int end) {for (int i = start; i <= end; ++i)cout << arr[i] << ' ';cout << endl; } void randData(int *arr, int start, int end) {for (int i = start; i <= end; ++i)arr[i] = rand() % 20; cout << "the old array:\n ";print(arr, start, end); } int partition(int *arr, int start, int end){cout << "before partition:" << endl;print(arr, start, end);//打印一次partition之前的数组int key = arr[end];int i, j, k;i = start - 1;//i指向小于基准元素的序列的末尾j = i;//j指向等于基准元素的序列的末尾for(k = start; k != end; ++k)//k指向当前遍历到的元素{if (arr[k] < key){swap(arr[++j], arr[k]);swap(arr[j], arr[++i]);}else if (arr[k] == key){swap(arr[++j], arr[k]);}}swap(arr[++j], arr[end]);cout << "after partition:" << endl;print(arr, start, end);//打印一次partition之后的数组cout << endl;return j;}void quickSort(int *arr, int start, int end) {if (start < end){int k = partition(arr, start, end);quickSort(arr, start, k - 1);quickSort(arr, k + 1, end);} } int main() {bool bIsContinue = true;char ch = 'n';const int Len = 10;int arr[Len];while (true == bIsContinue){randData(arr, 0, Len - 1);quickSort(arr, 0, Len - 1);cout << "the new array:\n ";print(arr, 0, Len - 1);cout << "please input yes or no" << endl;cin >> ch;if (ch == 'y' || ch == 'Y')bIsContinue = true;elsebIsContinue = false;} return 0; }
- 微软面试题:三路划分快速排序---针对重复关键字的改进
- 快速排序(2)算法改进--小的子文件、三者取中、重复关键字三路划分
- 快速排序(三路划分)解决大量重复元素
- 快速排序的三路划分法
- 针对重复键值的3路快速排序算法
- 排序算法之三路划分的快速排序
- C++ 快速排序算法的实现与改进(含笔试面试题)
- 微软面试题<三>
- 算法<基于三路划分的快速排序>
- <算法>基于三路划分的链表快速排序
- 快速排序(Java),针对重复元素
- 微软面试题(三)
- 快速排序的改进
- 快速排序的改进
- 快速排序的改进
- 改进的快速排序
- 三种快速排序算法的实现(递归算法、非递归算法、三路划分快速排序)
- 三种快速排序算法的实现(递归算法、非递归算法、三路划分快速排序)
- MyEclipse6.5没有响应 关闭后出现"JVM terminated exit code = -805306369"解决
- 一个简单的词频分析统计程序
- tera term的ttl脚本使用方法
- android 下测试网络的丢包率和延迟
- 字符串转16进制
- 微软面试题:三路划分快速排序---针对重复关键字的改进
- apache+php+mysql
- Hibernate重要规则总结
- 判断电脑哪些事串口
- 32位字节序转换
- Linux2.6.37内核异常跳转流程
- 解决WebLogic12C与Hibernate3.3的Antlr包冲突问题
- Flash Socket安全问题
- Apk常用调试方法