快速排序和快速选择
2016-04-10 13:01
393 查看
1.快速排序
这个快排的代码是基于算法导论中的介绍写的,将数组中最后一个元素作为pivot,设置两个指针i,j,都从数组头开始,当j遇到比pivot小的元素时,就将i和j的元素交换,否则j一直向后搜寻,i保持不动,最后将i递增1,与pivot元素交换,此时pivot前面的都是比pivot小的元素,后面都是比pivot大的元素,再分别对前后两个区间进行重复的操作。直到完全排序。
2.快速选择
这个快速选择代码是找到数组中第k个元素(k从0到n-1),思想和上面的快排一致,只不过现在找到了第k个元素所在的区间后,只需在所在区间进行下一次搜寻,另一个区间就不用管了。
这个快排的代码是基于算法导论中的介绍写的,将数组中最后一个元素作为pivot,设置两个指针i,j,都从数组头开始,当j遇到比pivot小的元素时,就将i和j的元素交换,否则j一直向后搜寻,i保持不动,最后将i递增1,与pivot元素交换,此时pivot前面的都是比pivot小的元素,后面都是比pivot大的元素,再分别对前后两个区间进行重复的操作。直到完全排序。
#include <iostream> #include <vector> using namespace std; int partition(vector<int> &nums, int start, int end) { int i = start - 1; for (int j = start; j < end; j++) { if (nums[j] <= nums[end]) { i = i + 1; int temp = nums[i]; nums[i] = nums[j]; nums[j] = temp; } } i = i + 1; int temp = nums[i]; nums[i] = nums[end]; nums[end] = temp; return i; } void quicksort(vector<int> &nums, int start, int end) { if (start < end) { int q = partition(nums, start, end); quicksort(nums, start, q - 1); quicksort(nums, q + 1, end); } } int main() { int a[7] = { 1,5,2,7,4,9,4 }; vector<int> nums(a,a+7); int n = nums.size(); quicksort(nums, 0, n - 1); for (int i = 0; i < n; i++) { cout << nums[i] << '\t'; } }
2.快速选择
这个快速选择代码是找到数组中第k个元素(k从0到n-1),思想和上面的快排一致,只不过现在找到了第k个元素所在的区间后,只需在所在区间进行下一次搜寻,另一个区间就不用管了。
#include <iostream> #include <vector> using namespace std; int partition(vector<int> &nums, int start, int end) { int i = start - 1; for (int j = start; j < end; j++) { if (nums[j] <= nums[end]) { i = i + 1; int temp = nums[i]; nums[i] = nums[j]; nums[j] = temp; } } i = i + 1; int temp = nums[i]; nums[i] = nums[end]; nums[end] = temp; return i; } void quickselect(vector<int> &nums, int start, int end, int k) { if (start == end||start==k) { cout << nums[start]; return; } if (end == k) { cout << nums[end]; return; } if (start < end) { int q = partition(nums, start, end); if (q == k) { cout << nums[k]; return; } else if (q > k) { quickselect(nums, start, q - 1, k); } else { quickselect(nums, q + 1, end, k); } } } int main() { int a[7] = { 1,5,2,7,4,9,4 }; vector<int> nums(a, a + 7); int n = nums.size(); quickselect(nums, 0, n - 1,1); }
相关文章推荐
- DEV-C++对c文件提示无法编译的问题
- 公网IP与私网IP区别
- 虚拟机Vmware上安装Ubuntu操作系统,如何配置Vmware tools
- CentOS运行C++出现内存错误——double free or coruption
- 抽奖系统数据库设计
- 关于Go语言,自己定义结构体标签的一个妙用.
- WHOJ 1606 - Funny Sheep【水】
- 学习编程经典书籍
- 神经单元
- 欢迎使用CSDN-markdown编辑器
- myeclipse如何修改Web项目名称
- 九度 1010
- 使用Google浏览器必备的插件
- Two Sum(初谈双指针)
- nmon结果分析
- android中对输入手机号码有效性验证(是否为正确的手机号码)
- 将非Maven管理的jar打包到Maven本地资源库
- Maven3 --- Eclipse集成Maven
- 组合数
- Sharepoint 构建轻量型应用之传出电子邮件设置!