算法竞赛——快速排序
算法竞赛——快速排序
快速排序算法和归并排序算法都可以用分治法的思想来解决,其区别是归并排序是等份左右划分,而快速排序则是按标兵进行划分,也不需要合并。
- 分治三步骤
- 划分问题:按标兵元素,将序列分成左右两部分,左边序列全小于等于标兵元素,右边序列全大于等于标兵元素。
- 递归求解:把左右两部分分别排序。
- 合并问题:不用合并,因为容器内元素已然有序。
算法实现
// 快速排序算法
void qSort(int *a, int lef, int righ) {// 递归边界if(lef > righ) {return;}// 取标兵值int centerV = a[lef + (righ - lef) / 2];// 大于标兵值的元素放在标兵值右边// 小于标兵值的元素放在标兵值左边int i = lef;int j = righ;while(i <= j) {// 从左往右扫描到大于标兵值的元素for(; i <= j; i++) {if(a[i] >= centerV) {break;}}// 从右往左扫描到小于标兵值的元素for(; j >= i; j--) {if(a[j] <= centerV) {break;}}// 退出条件if(i > j) {break;}// 交换swap(a[i], a[j]);i++;j--;}// 递归求解左半qSort(a, lef, j);// 递归求解右半qSort(a, i, righ);}
测试主程序
#include <iostream>
#include <algorithm>
#include <ctime>
#include <fstream>using namespace std;// 快速排序算法
void qSort(int *a, int lef, int righ) {// 递归边界if(lef > righ) {return;}// 取标兵值int centerV = a[lef + (righ - lef) / 2];// 大于标兵值的元素放在标兵值右边// 小于标兵值的元素放在标兵值左边int i = lef;int j = righ;while(i <= j) {// 从左往右扫描到大于标兵值的元素for(; i <= j; i++) {if(a[i] >= centerV) {break;}}// 从右往左扫描到小于标兵值的元素for(; j >= i; j--) {if(a[j] <= centerV) {break;}}// 退出条件if(i > j) {break;}// 交换swap(a[i], a[j]);i++;j--;}// 递归求解左半qSort(a, lef, j);// 递归求解右半qSort(a, i, righ);}void quickSort(int *a, int n) {qSort(a, 0, n - 1);
}// 生成指定范围的随机数
int random(int m, int n) {int pos, dis;if(m == n) {return m;} else if(m > n) {pos = n;dis = m - n + 1;return rand() % dis + pos;} else {pos = m;dis = n - m + 1;return rand() % dis + pos;}
}// 产生随机序列
void makeRandomSequences(int m, int n, int num) {ofstream filerandom("quicksort.in");// 根据时间产生相应的种子值srand((int)time(NULL));for(int i = 0; i < num; i++) {filerandom << random(m, n) << " ";// 数据量逢十换行if(!((i + 1) % 10)) {filerandom << endl;}}filerandom.close();
}int main() {
// // 测试数据(小量)
// int a[] = {321, 3, -3, 5, 5, 3, 5435, -11, 3423, 4432, -4421, 34432};
// int n =12;
// cout << "排序之前:";
// for(int i = 0; i < n; i++) {// cout << a[i] << " ";
// }
// cout << endl;
//
// quickSort(a, n);
//
// cout << "排序之后:";
// for(int i = 0; i < n; i++) {// cout << a[i] << " ";
// }
// cout << endl;// 产生随机序列// makeRandomSequences(-10000, 10000, 100000);int a[200000];int n = 0;ifstream fileInSeq("quicksort.in");// 打开失败if(!fileInSeq.is_open()) {cout << "Error opening file" << endl;return -1;}// 赋值处理while(!fileInSeq.eof()) {fileInSeq >> a[n++];}fileInSeq.close();n--;quickSort(a, n);ofstream fileOutSeq("quicksort.out");for(int i = 0; i < n; i++) {fileOutSeq << a[i] << " ";if(!((i + 1) % 10)) {fileOutSeq << endl;}}return 0;
}
算法竞赛——快速排序相关推荐
- 刘汝佳《算法竞赛入门经典》---总结
刘汝佳:<算法竞赛入门经典> 三步: 基本的数据结构+算法知识: 数论等数学基本知识: 锻炼联想建模能力.知识与实际相结合,解决实际问题! 第一章:程序设计入门 1.a/b 当a.b为整数 ...
- 我的所有优质博客全部开源啦(我自己原创的《ACM模板》《算法全家桶》《算法竞赛中的初等数论》 PDF免费下载)
你好呀ヾ(≧▽≦*)o 我是繁凡さん 这两年来我写了很多长篇文章,主要涉及数据结构,算法,程序设计竞赛,数学,计算几何等方面的内容: <数据结构>C语言版(清华严蔚敏考研版) 全书知识梳理 ...
- 《算法竞赛入门经典(第二版)》pdf
下载地址:网盘下载 内容简介 · · · · · · <算法竞赛入门经典(第2版)>是一本算法竞赛的入门与提高教材,把C/C++语言.算法和解题有机地结合在一起,淡化理论,注重学习方法和 ...
- 程序设计算法竞赛基础——练习2解题报告
程序设计算法竞赛基础--练习2解题报告 1001 sort Problem Description 给你n个整数,请按从大到小的顺序输出其中前m大的数. Input 每组测试数据有两行,第一行有两个数 ...
- 约瑟夫环c语言出现段错误,算法竞赛入门经典 紫书 第四章
一点小问题 关于判断素数的几点 //该函数有严重缺点: //不能用于n==1和n较大的情况 //在n接近int的最大值时: //若i=46340时,i*i=2147395600//若i=46341时, ...
- 《算法竞赛入门经典(第2版)》
<算法竞赛入门经典(第2版)> 基本信息 作者: 刘汝佳 丛书名: 算法艺术与信息学竞赛 出版社:清华大学出版社 ISBN:9787302356288 上架时间:2014-6-5 出版日期 ...
- 算法学习---快速排序和归并排序.
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言AcWing算法学习第一节 一.排序 1.快速排序 2.归并排序 总结:这些模板一定要理解着学习,但是先理解尽力去理解, ...
- 算法竞赛基础训练题_选择题
算法竞赛基础训练题 选择题 For a sequentially stored linear list of length N, the time complexities for query and ...
- 古老的密码(Ancient Cipher,UVa1339)(算法竞赛入门经典 例题4-1)C++
题目:给定两个不超过100的字符串,判断是否可以做到将其中一个字符串通过重排和映射的操作,使得两个字符串相同.例如,JWPUDJSTVP重排后可以得到WJDUPSJPVT,然后每个字母只要通过一次映射 ...
最新文章
- 返回键捕获 应用程序退出的两种方式(转)
- python内置函数源码_如何查看python内置函数源码
- 浅谈C++函数的参数
- 【全链路质量监控与QoE】
- 通达信缠论买卖点公式_通达信缠论多空主图指标公式
- 执行-技术人的管理之路--总结
- 滑动窗口1——无重复字符的最长字串
- bzoj 1565 [NOI2009]植物大战僵尸【tarjan+最大权闭合子图】
- 当WEB2.0从概念变成电子商务网站的工具
- Mac上crontab与/etc/crontab定时任务
- PIX、ASA防火墙清除配置
- scala implicit隐式转化与隐式参数
- turbo c语言编程,turbo c3.0官方版下载-Turbo C下载[编程工具]-天极下载
- mini聊天室(Linux下基于UDP实现的群聊系统)
- 阿里云DataV数据展示的一些sql写法
- 代理模式——保护代理(三)
- 与泽风格--爱的季节
- Android 双卡双待支持检验SIM信息获取
- LCMS零件同步-字符串解析
- Gentoo 2005.1 完整的USE参数清单中文详解(转)
热门文章
- oracle生成excle报表,oracle自动生成excel报表(时间为变量,条件含变量)
- java 课后习题 随机整数最大值和最小值
- 【Java】利用for循环打印心型
- Vercel反向代理做CDN,免费给网站加速隐藏源站,可绑定域名
- java 多线程使用线程池_Java多线程:如何开始使用线程
- elixir开发的项目_我对Elixir的介绍:学习另一种编程语言如何使您成为更好的开发人员...
- 我如何使用Python查找有趣的人来关注Medium
- 修改webpack配置,在react中使用less
- java springMVC生成二维码
- 尚学堂java 参考答案 第七章