仅作为记录,有空可以温故

使用了三种选择pivot的策略,前两种分别是1、选择第一个元素作为pivot;2、选择最后一个元素作为pivot;3、选择前、中、后三个元素中大小中等的元素作为pivot。其中前两种在注释里。

#include <iostream>
#include <stdlib.h>
#include <fstream>
#include <ctime>
usingnamespace std;
unsigned longint comparNum = 0;
constint MAXN = 10000;
void QuickSort(int A[], int low, int high);
int Median3( int A[], int low, int high);
int Partition(int A[], int low, int high);
void swap( int *, int *);
int main()
{//read file,initial a integer vectortime_t begin,end;begin = clock();ifstream fin("QuickSort");string cArr[MAXN];int arr[MAXN];for (int i = 0; i < MAXN; ++i){getline(fin, cArr[i]);arr[i] = atoi(cArr[i].c_str());}fin.close();QuickSort(arr, 0, MAXN - 1);cout << "The number of comparisons is: " << comparNum <<endl;end = clock();cout << "The running time is:" << double(end - begin)/CLOCKS_PER_SEC <<endl;
return 0;
}
void QuickSort(int A[], int low, int high)
{
if (low >= high)
return;
elseif (high - low == 1){comparNum += 1;
if(A[ low ] > A[ high ])swap(&A[ low ], &A[ high ]);}
else{
int pivot_loc = Partition(A, low, high);QuickSort(A, low, pivot_loc - 1);QuickSort(A, pivot_loc + 1, high);}
}
int Partition(int A[], int low, int high)
{
//#1
//int pivot = A[low];
//#2
//int pivot = A[high];
//swap(&A[low], &A[high]);
//#3
int pivot = Median3( A, low, high);
int i = low+1;
int j = low+1; //the most left
for (; j <= high; ++j) {
if ( A[j] < pivot) {swap( &A[j], &A[i]);++i;}}swap(&A[low], &A[i-1]);comparNum += high - low;
return (i-1);
}
void swap( int *a, int *b)
{
int c = *a;*a = *b;*b = c;
}
int Median3( int A[], int low, int high)
{
int center = (low + high) / 2;
int temp[3] = {A[ low ], A[ center ], A[ high ]};
if (temp[0] > temp [1])swap(&temp[0], &temp[1]);
if (temp[0] > temp [2])swap(&temp[0], &temp[2]);
if (temp[1] > temp [2])swap(&temp[1], &temp[2]);
//Invariant: temp[0] <= temp[1] <= temp[2]
if (A[ center ] == temp[ 1 ])swap(A[ center ], A[ low ]);
elseif (A[ high ] == temp[ 1 ])swap(A[ high ], A[ low ]);
return A[ low ];
}
51的自动打乱排版功能非常不错。

转载于:https://blog.51cto.com/hector/816134

快速排序的C++实现相关推荐

  1. Golang TDD实践报告:快速排序Quick Sort

    Golang TDD实践报告:快速排序Quick Sort [阅读时间:约5分钟] 0.项目需求 1.编写符合项目输入输出的一个测试 2.尝试运行测试 3.先使用最少的代码来让失败的测试先跑起来 4. ...

  2. 算法图解/二分查找/简单查找/选择排序/递归算法/快速排序算法/

    大 O 表示法 大 O 表示法在讨论运行时间时,log 指的都是 log2 大 O 表示法指出了算法有多快,让你能够比较操作数,它指出了算法运行时间的增速,而并非以秒为单位的速度. 大 O 表示法指出 ...

  3. 数据结构学习(十三)、快速排序

    基本思想:通过一趟排序将待排记录分割成独立两个部分,其中一部分记录的关键字均比另一部分记录的关键字小, 则可分别对这两部分继续进行排序,重复操作以上操作,已达到整个序列有序的目的 void Quick ...

  4. 快速排序(快排)--->注释超详细

    基本思想:         1.先选取一个基准值(一般选取数组第一个元素).         2.以第一步选取的基准值为标准,然后从最后一个数值开始一步步向前走将数字与基准值进行比较,如果该值大于基准 ...

  5. 快速排序的两种实现方法(c语言版本)

    经过调研发现,对任意无序整数数组,快速排序有两种实现方法,这里简单阐述下思路: 思路一:随意选择一个基准元,一般选择数组的起始元或末尾元,Weiss这本书上特意搞了个算法来选择基准元,--,总之就是基 ...

  6. 【经典算法】快速排序

    与归并排序一样,快速排序使用也使用了分治的思想.下面是对一个典型的子数组A[p,...,r]进行快速排序的三步分治过程: 分解:数组A[p,...,r]被划分成两个(可能为空)子数组A[P,...,q ...

  7. 20140725 快速排序时间复杂度 sTL入门

    1.快速排序的时间复杂度(平均时间复杂度为) 数组本身就有序时,效果很差为O(n^2) 2.STl入门 (1) C++内联函数(inline)和C中宏(#define)区别 内联函数有类型检查,宏定义 ...

  8. java 快排_八大排序-快速排序(搞定面试之手写快排)

    概要 快速排序由C. A. R. Hoare在1960年提出,是八大排序算法中最常用的经典排序算法之一.其广泛应用的主要原因是高效,核心算法思想是分而治之.快速排序经常会被作为面试题进行考察,通常的考 ...

  9. 排序学习之---快速排序

    一.前言 快速排序是一种交换排序,它由C. A. R. Hoare在1962年提出. 二.算法思想 快速排序的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分:分割点左边都是比它小的数,右边都 ...

  10. java 冒泡排序和快速排序 实现

    面试的时候经常会遇到面试官让你直接手写排序算法,下面是冒泡排序和快速排序的实现. 冒泡排序 基本流程就是,自下而上比较相邻的两个元素进行比较,让大的元素往下面沉,较小的往上冒.按照排序规则进行比较,如 ...

最新文章

  1. 简单的石头剪刀布(机器胜率略高)
  2. 《原神》三测:在内购抽卡的商业模式上诞生的开放游戏世界
  3. java ee的小程序_Java EE 8 –为更多设备提供更多应用程序
  4. Kendo UI开发教程:Kendo UI模板概述
  5. 两种解除禁止右键、选中、复制的方法
  6. PYMODM使用记录
  7. CNN看清世界——浅谈四个经典网络的差异
  8. 在windows server 2008 R2上运行disk cleanup
  9. 纵坐标范围_探索频率范围与频响的奥秘
  10. delphi 检测网络是否连通_WebRTC:连接建立过程的网络穿透
  11. java垃圾收集器、Serial收集器、ParNew收集器、Parallel Scavenge收集器、Serial Old 收集器、CMS收集器、G1收集器、如何查看GC日志
  12. cocos2dx lua 反编译(20170417增加补充说明)(转)
  13. 基于xsh的vbs脚本的使用(条件判断和函数)
  14. Java 模拟鼠标、键盘--向可编辑窗口录入内容
  15. 修真院教学模式四大体系之开发流程
  16. 后缀是lnk是什么文件_lnk是什么格式_lnk后缀是什么格式
  17. 不是抽象类的基类不是好基类
  18. 淘宝商品历史价格接口/商品历史价走势接口代码对接分享
  19. 无为,无我,无欲,居下,清虚,自然
  20. 清除kk5c.com这个恶意插件

热门文章

  1. [文件、数据库、XML]window phone 利用StreamWriter写入文件问题
  2. Windows服务器常用命令
  3. Linux 查询股价工具,find 查找工具
  4. 获取bootgrid选中行数据_Easyui 取得选中行数据_EasyUI 教程
  5. python的django_真正搞明白Python中Django和Flask框架的区别
  6. mysql中having的例子_有关mysql中having子句对组记录进行筛选的例子
  7. 微信小程序 css边框阴影,微信小程序|CSS的内边距和圆框
  8. 浏览器 刷新页面后回到顶部_当你在浏览器中,忘记了曾经的登录密码怎么办......
  9. python修改csv文件字段顺序_Pandas中DataFrame交换列顺序的方法实现
  10. c语言中堆栈_C语言编程中的堆栈