先贴上代码: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- ...
随机推荐
- GO语言数组和切片实例详解
本文实例讲述了GO语言数组和切片的用法.分享给大家供大家参考.具体分析如下: 一.数组 与其他大多数语言类似,Go语言的数组也是一个元素类型相同的定长的序列. (1)数组的创建. 数组有3种创建方式: ...
- android修改系统时区
动态注册广播接收器必须有实例存在 静态不要实例存在 设置系统时区: AlarmManager mAlarmManager = (AlarmManager)getSystemService(Con ...
- 【BZOJ 2648】SJY摆棋子 & 【BZOJ 2716】【Violet 3】天使玩偶
KDTree模板,双倍经验啦啦啦- #include<cstdio> #include<cstring> #include<algorithm> #define r ...
- java中map<string,int>
java中 Iterator it=wordsmap.entrySet().iterator(); while(it.hasNext()) { Map.Entry<String,Integer& ...
- R 绘图 填充颜色
d <- density(mtcars$mpg) plot(d, main="Kernel Density of Miles Per Gallon") polygon(d, ...
- iOS支付宝的使用
打开“APViewController.m”文件,对以下三个参数进行编辑. 二.集成支付宝到自己的工程 1.启动Xcode,为了方便快速开发,将解压包里面的AlipaySDK.bundle和Alipa ...
- 72.40个Android面试题(转载)
1. Android的四大组件是哪些,它们的作用? 答:Activity:Activity是Android程序与用户交互的窗口,是Android构造块中最基本的一种,它需要为保持各界面的状态,做很多持 ...
- Java多线程与并发库高级应用-工具类介绍
java.util.concurrent.Lock 1.Lock比传统线程模型中的synchronized方式更加面向对象,与生活中的锁类似,锁本身也应该是一个对象.两个线程执行的代码片段要实现同步互 ...
- js-JavaScript高级程序设计学习笔记4
第六章 面向对象的程序设计 1.面向对象的语言有一个标志,那就是它们都有类的概念,而通过类可以创建任意多个具有相同属性和方法的对象.如python.ES中没有类的概念. 2.ES的对象可以想象成散列表 ...
- ubuntu apt-get update失败 解决方法
ubuntu apt-get update失败 1.出现错误:E:Could not get lock /var/lib/apt/lists/lock - open (11: Resource tem ...