算法竞赛——快速排序

快速排序算法和归并排序算法都可以用分治法的思想来解决,其区别是归并排序是等份左右划分,而快速排序则是按标兵进行划分,也不需要合并。

分治三步骤
划分问题:按标兵元素,将序列分成左右两部分,左边序列全小于等于标兵元素,右边序列全大于等于标兵元素。
递归求解:把左右两部分分别排序。
合并问题:不用合并,因为容器内元素已然有序。

算法实现

// 快速排序算法
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. 刘汝佳《算法竞赛入门经典》---总结

    刘汝佳:<算法竞赛入门经典> 三步: 基本的数据结构+算法知识: 数论等数学基本知识: 锻炼联想建模能力.知识与实际相结合,解决实际问题! 第一章:程序设计入门 1.a/b 当a.b为整数 ...

  2. 我的所有优质博客全部开源啦(我自己原创的《ACM模板》《算法全家桶》《算法竞赛中的初等数论》 PDF免费下载)

    你好呀ヾ(≧▽≦*)o 我是繁凡さん 这两年来我写了很多长篇文章,主要涉及数据结构,算法,程序设计竞赛,数学,计算几何等方面的内容: <数据结构>C语言版(清华严蔚敏考研版) 全书知识梳理 ...

  3. 《算法竞赛入门经典(第二版)》pdf

    下载地址:网盘下载 内容简介  · · · · · · <算法竞赛入门经典(第2版)>是一本算法竞赛的入门与提高教材,把C/C++语言.算法和解题有机地结合在一起,淡化理论,注重学习方法和 ...

  4. 程序设计算法竞赛基础——练习2解题报告

    程序设计算法竞赛基础--练习2解题报告 1001 sort Problem Description 给你n个整数,请按从大到小的顺序输出其中前m大的数. Input 每组测试数据有两行,第一行有两个数 ...

  5. 约瑟夫环c语言出现段错误,算法竞赛入门经典 紫书 第四章

    一点小问题 关于判断素数的几点 //该函数有严重缺点: //不能用于n==1和n较大的情况 //在n接近int的最大值时: //若i=46340时,i*i=2147395600//若i=46341时, ...

  6. 《算法竞赛入门经典(第2版)》

    <算法竞赛入门经典(第2版)> 基本信息 作者: 刘汝佳 丛书名: 算法艺术与信息学竞赛 出版社:清华大学出版社 ISBN:9787302356288 上架时间:2014-6-5 出版日期 ...

  7. 算法学习---快速排序和归并排序.

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言AcWing算法学习第一节 一.排序 1.快速排序 2.归并排序 总结:这些模板一定要理解着学习,但是先理解尽力去理解, ...

  8. 算法竞赛基础训练题_选择题

    算法竞赛基础训练题 选择题 For a sequentially stored linear list of length N, the time complexities for query and ...

  9. 古老的密码(Ancient Cipher,UVa1339)(算法竞赛入门经典 例题4-1)C++

    题目:给定两个不超过100的字符串,判断是否可以做到将其中一个字符串通过重排和映射的操作,使得两个字符串相同.例如,JWPUDJSTVP重排后可以得到WJDUPSJPVT,然后每个字母只要通过一次映射 ...

最新文章

  1. 返回键捕获 应用程序退出的两种方式(转)
  2. python内置函数源码_如何查看python内置函数源码
  3. 浅谈C++函数的参数
  4. 【全链路质量监控与QoE】
  5. 通达信缠论买卖点公式_通达信缠论多空主图指标公式
  6. 执行-技术人的管理之路--总结
  7. 滑动窗口1——无重复字符的最长字串
  8. bzoj 1565 [NOI2009]植物大战僵尸【tarjan+最大权闭合子图】
  9. 当WEB2.0从概念变成电子商务网站的工具
  10. Mac上crontab与/etc/crontab定时任务
  11. PIX、ASA防火墙清除配置
  12. scala implicit隐式转化与隐式参数
  13. turbo c语言编程,turbo c3.0官方版下载-Turbo C下载[编程工具]-天极下载
  14. mini聊天室(Linux下基于UDP实现的群聊系统)
  15. 阿里云DataV数据展示的一些sql写法
  16. 代理模式——保护代理(三)
  17. 与泽风格--爱的季节
  18. Android 双卡双待支持检验SIM信息获取
  19. LCMS零件同步-字符串解析
  20. Gentoo 2005.1 完整的USE参数清单中文详解(转)

热门文章

  1. oracle生成excle报表,oracle自动生成excel报表(时间为变量,条件含变量)
  2. java 课后习题 随机整数最大值和最小值
  3. 【Java】利用for循环打印心型
  4. Vercel反向代理做CDN,免费给网站加速隐藏源站,可绑定域名
  5. java 多线程使用线程池_Java多线程:如何开始使用线程
  6. elixir开发的项目_我对Elixir的介绍:学习另一种编程语言如何使您成为更好的开发人员...
  7. 我如何使用Python查找有趣的人来关注Medium
  8. 修改webpack配置,在react中使用less
  9. java springMVC生成二维码
  10. 尚学堂java 参考答案 第七章