先贴上代码:Random快排,快排的非递归实现
#include <stdlib.h>
#include <stdio.h>
#include <vector>
#include <stack>
int partition(int a[], int left, int right) //partition函数以第一个元素作为pivot
{
if(a == NULL) //做异常处理
return -1;
if(left >= right)
return -1; int X = a[left];
int i = left;
int j = right; while(i < j)
{
while(i < j && a[j] > X) //从最右边找到第一个小于pivot的元素
j--;
if(i < j) //因为上面的循环出来可能i == j,所以如果i < j再令a[i] = a[j] 且 i = i + 1;
a[i++] = a[j]; //因为第一个元素是pivot已经被记录为X了,所以数组可以看做有一个空位在a[first](a[i])
while(i < j && a[i] <= X)
i++;
if(i < j)
a[j--] = a[i]; //因为a[j]已经在上面移到了a[first],所以a[j]是一个空位,可以用a[i]赋值
}
a[i] = X;
return i;
} void stack_implement_quickSort(int a[], int left, int right)
//如果之前看懂了如何非递归先序遍历二叉树,这个程序应该很好理解
{
std::stack<std::pair<int, int> > s;
int mid = partition(a, left, right); if(mid == -1)
return;
if(left < mid-1)
{
s.push(std::make_pair(left, mid-1));
}
if(mid+1 < right)
{
s.push(std::make_pair(mid+1, right));
} while(!s.empty())
{
std::pair<int,int> topPair = s.top();
s.pop(); mid = partition(a, topPair.first, topPair.second); if(mid == -1)
return;
if(topPair.first < mid-1)
{
s.push(std::make_pair(topPair.first, mid-1));
}
if(mid+1 < topPair.second)
{
s.push(std::make_pair(mid+1, topPair.second));
}
}
} int main(){
int a[] = {1,2,9,2,2,2,2,3,10,4,5,7,4};
stack_implement_quickSort(a, 0, 12);
return 0;
} /*采用递归的方法
void quickSort(int a[], int p, int q){
if (p <= q){
int r = partition(a, p, q);
if(r == -1)
return;
quickSort(a, p, r-1);
quickSort(a, r+1,q);
}
} int main(){
int a[] = {1,2,9,2,2,2,2,3,10,4,5,7,4};
quickSort(a, 0, 12);
int i = 0;
}
*/
随机选取主元:
#include <stdlib.h>
#include <stdio.h> int partition(int a[], int p, int q){
int pivot = rand() % (q-p+1) + p;
int i = p;
int j = q;
int key = a[pivot]; while(i < j){ while(i < j && a[i] < key){
i++;
}
if(i < j){
a[pivot] = a[i];
a[i] = key;
pivot = i;
} while(i < j && a[j] >= key){
j--;
}
if(i < j){
a[pivot] = a[j];
a[j] = key;
pivot=j;
}
}
return pivot;
} void quickSort(int a[], int p, int q){
if (p <= q){
int r = partition(a, p, q);
quickSort(a, p, r-1);
quickSort(a, r+1,q);
}
} int main(){
int a[] = {1,2,9,2,2,2,2,3,10,4,5,7,4};
quickSort(a, 0, 12);
int i = 0;
}
先贴上代码:Random快排,快排的非递归实现的更多相关文章
- 超实用的Eclipse快捷键大全(解密为什么他们的代码写的又快又好~)
1.Ctrl+s:快速保存代码 一定要记得随时随地用Ctrl+s来保存我们的代码哦!!!不然等到电脑关机或者是使用的Eclipse突然闪退就欲哭无泪了.此时脑海里就突然出现了哔哔哔的画面~ 2.Alt ...
- 90% 的 Java 程序员都说不上来的为何 Java 代码越执行越快(2)- TLAB预热
经常听到 Java 性能不如 C/C++ 的言论,也经常听说 Java 程序需要预热,那么其中主要原因是啥呢? 面试的时候谈到 JVM,也有很多面试官喜欢问,为啥 Java 程序越执行越快呢? 一般人 ...
- C语言 | 栈的应用 | 非递归栈实现快排
/* 非递归栈实现快排 */ #include <stdio.h> #include <math.h>> #include <malloc.h> #inclu ...
- 归并非递归、快排递归及非递归的C++实现及时间效率对比。。
今天看剑指offer突然发现下学期都要去面试了,还没自己实现过快排非递归和归并非递归,这怎么能行呢,于是就写了一下. (虽然有点卡壳,又回去翻了下算导,还是顺利写出来了) 先放图: 一亿数据量: #p ...
- OpenGL快问快答
OpenGL快问快答 本文内容主要来自对(http://www.opengl.org/wiki/FAQ)的翻译,随机加入了本人的观点.与原文相比,章节未必完整,含义未必雷同,顺序未必一致.仅供参考. ...
- html5 vedio 播放器,禁掉进度条快进快退事件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 快读&快写模板【附O2优化】
快读&快写模板 快读快写,顾名思义,就是提升输入和输出的速度.在这里简单介绍一下几种输入输出的优劣. C++ cin/cout 输入输出:优点是读入的时候不用管数据类型,也就是说不用背scan ...
- P1908 逆序对——树状数组&离散化&快读快写の学习
题目简述: 对于给定的一段正整数序列,逆序对就是序列中 a_i>a_jai>aj 且 i<ji<j 的有序对. 输出序列中逆序对的数目. 知识补充: 树状数组: 这东西就是 ...
- fzu Problem 2198 快来快来数一数 (快速幂+优化)
题目链接: Problem 2198 快来快来数一数 题目描述: 给出n个六边形排成一排,a[i]代表i个六边形能组成的生成树个数,设定s[i]等于a[1]+a[2]+a[3]+....+a[i- ...
随机推荐
- BroadcastReceiver之SD的挂载监听
首先,新建一个类,继承于BroadcastReceiver,然后去配置Manifest.xml这就不用说了, 注意配置Manifest.xml时候的一些细节 必须加上<data android: ...
- 1018LINUX中crontab的用法
转自http://blog.csdn.net/ethanzhao/article/details/4406017#comments 基本格式 :* * * * * command分 时 日 月 周 命 ...
- js中如何去获取外部css样式
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...
- 分析函数——keep(dense_rank first/last)
来源于:http://blog.itpub.net/28929558/viewspace-1182183/ 销售表:SQL> select * from criss_sales where de ...
- Kernel Methods (1) 从简单的例子开始
一个简单的分类问题, 如图左半部分所示. 很明显, 我们需要一个决策边界为椭圆形的非线性分类器. 我们可以利用原来的特征构造新的特征: \((x_1, x_2) \to (x_1^2, \sqrt 2 ...
- nefu 117 素数定理
小明是一个聪明的孩子,对数论有着很浓烈的兴趣.他发现求1到正整数10n 之间有多少个素数是一个很难的问题,该问题的难以决定于n 值的大小.现在的问题是,告诉你n的值,让你帮助小明计算小于10n的素数的 ...
- poi-处理excel的单元格日期数据
poi处理excel时,当excel没有明确指明是哪个类型的数据时,poi很可能处理单元格的日期数据时就有可能是一串数字.而使用java程序基本无法转换 以下为对poi处理日期情况一些方面的处理(不是 ...
- node.js-概念
官方网站:http://nodejs.cn/ 1.Node 是一个服务器端 JavaScript 解释器,可是真的以为JavaScript不错的同学学习Node就能轻松拿下,那么你就错了,总结:水深不 ...
- 使用redis避免客户端频繁提交数据
避免客户端频繁向服务器提交表单的解决方案 使用redis 在order的model中增加函数 ) { try{ $key = "lock_" . $key; $num = $thi ...
- Yii2的Debug工具
yii2的Debug工具 调用 r=debug 可以对程序进行性能分析,从而对程序进行改良 (1)数据库某条sql语句的执行时间 (2)debug的profiling标签 \YII::beginP ...