c++之快速排序改进(随机值)
- 数量少(5~25),插入排序很高效
- 一个影响快排效率的因素就是: 基准值的选择
- 本文将演示一种随之法的快排
改进前
void quick_sort5(int arr[], int low, int high)
{
if (0 > low || 0 > high)
return;
if (low > high)
return;
int left = low;
int right = high;
int key = arr[low];
while (left < right)
{
while (left < right && arr[right] >= key)
--right;
if (left < right)
arr[left++] = arr[right];
while (left < right && arr[left] < key)
++left;
if (left < right)
arr[right--] = arr[left];
}
arr[left] = key;
quick_sort5(arr, low, left - 1);
quick_sort5(arr, left + 1, high);
}
改进后
template <typename T>
void quick_sort(T arr[], int low, int high)
{
if (0 > low || 0 > high)
return;
if (low > high)
return;
int left = low;
int right = high;
srand((unsigned) time(NULL));
int pivot_pos = (rand() % (high - low + 1)) + low;
int key = arr[pivot_pos];
while (left < right)
{
while (left < right && arr[right] >= key)
--right;
if (left < right)
arr[left++] = arr[right];
while (left < right && arr[left] < key)
++left;
if (left < right)
arr[right--] = arr[left];
}
arr[left] = key;
quick_sort(arr, low, left - 1);
quick_sort(arr, left + 1, high);
}
核心源码
srand((unsigned) time(NULL));
int pivot_pos = (rand() % (high - low + 1)) + low;
int key = arr[pivot_pos];
改为生成随机数的方法来获取基准数的索引。
缺点
很明显,随机值可能是 0 or max_pos,时间复杂度与改进前是一致的。
c++之快速排序改进(随机值)的更多相关文章
- python产生随机值-random模块
import random产生随机值的模块random.random() #获取一个随机的浮点值;help(random.random) #查看随机范围:0-1;random.uniform(1,10 ...
- js javascript 简易随机值穿插加解密【原】
适用场景 本方法适用于需要对敏感信息进行加密传输,但加解密要求又不高的场景,因为是前台的javascript加解密,所以其实还是能通过js代码分析出原始值来的. 如果您对信息极其敏感, 比例登录密码这 ...
- C-Linux_毫秒级随机值获取
秒级随机值-常用方法: #include <stdlib.h> #include <stdio.h> #include <stdio.h> #include < ...
- js取指定范围随机值【原】
js取指定范围随机值 <HTML> <HEAD> <meta http-equiv="content-Type"content="text/ ...
- TensorFlow随机值函数:tf.random_uniform
tf.random_uniform 函数 random_uniform( shape, minval=0, maxval=None, dtype=tf.float32, seed=None, name ...
- TensorFlow随机值:tf.random_normal函数
tf.random_normal 函数 random_normal( shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=No ...
- Python中random模块在主函数中设置随机种子是否对于调用的函数中的随机值产生影响?
一个问题,加入我有一个工程文件,在main函数里面调用random模块,设置随机种子,主函数中的随机种子的设置是否会影响主函数所调用的函数中的随机值? 实际上这个问题非常重要,比如你在跑网络的时候,初 ...
- loadRunner之参数化,对用户名和密码进行参数化,并打印输出---实际操作:用户登录的账号用随机值来登录
录制脚本,对用户名和密码进行参数化: Action() { web_url("WebTours", "URL=http://127.0.0.1:1080/WebTours ...
- go 实现每次生成不同随机值
直接使用rand.Intn(10) 多次运行发现每次的随机值都是一样的 查看 Intn方法的源码说明 // Intn returns, as an int, a non-negative pseudo ...
随机推荐
- 43-Reverse Nodes in k-Group
Reverse Nodes in k-Group My Submissions QuestionEditorial Solution Total Accepted: 58690 Total Submi ...
- 普通用户iptables规则持久化,开机自动恢复
本文档对于docker环境下并不适用,docker环境的iptables持久化请参考https://www.cnblogs.com/wiseo/p/15000745.html 添加iptables规则 ...
- 学习java的第二十天
一.今日收获 1.java完全学习手册第三章算法的3.2排序,比较了跟c语言排序上的不同 2.观看哔哩哔哩上的教学视频 二.今日问题 1.快速排序法的运行调试多次 2.哔哩哔哩教学视频的一些术语不太理 ...
- flink-----实时项目---day07-----1.Flink的checkpoint原理分析 2. 自定义两阶段提交sink(MySQL) 3 将数据写入Hbase(使用幂等性结合at least Once实现精确一次性语义) 4 ProtoBuf
1.Flink中exactly once实现原理分析 生产者从kafka拉取数据以及消费者往kafka写数据都需要保证exactly once.目前flink中支持exactly once的sourc ...
- 安全相关,关于https
什么是 HTTPS HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全 ...
- cordova配置与开发
1.环境配置 1.1.安装ant 从 apache官网 下载ant,安装并配置,将ant.bat所在目录加到path环境变量,如c:\apache-ant\bin\.在cmd中运行以下语句如不报错即可 ...
- spring注解事务管理
使用步骤: 步骤一.在spring配置文件中引入<tx:>命名空间<beans xmlns="http://www.springframework.org/schema/b ...
- 页面屏蔽backspace键
1 //页面加载完成 2 $(document).ready(function(){ 3 //禁止退格键 作用于Firefox.Opera 4 document.onkeypress = banBac ...
- jquery datatable使用简单示例
目标: 使用 jQuery Datatable 构造数据列表,并且增加或者隐藏相应的列,已达到数据显示要求.同时, jQuery Datatable 强大的功能支持:排序,分页,搜索等. Query ...
- Linux系统的负载与CPU、内存、硬盘、用户数监控的shell脚本
利用Shell脚本来监控Linux系统的负载.CPU.内存.硬盘.用户登录数. 这几天在学习研究shell脚本,写的一些系统负载.CPU.内存.硬盘.用户数监控脚本程序.在没有nagios监控的情况下 ...