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 ...
随机推荐
- canvas 基本介绍
# canvas 基本功能介绍 - canvas 能做什么 1. 绘制简单图形线条 2. 裁剪图片 - 开始绘制画布 新建html文档添加 canvas标签 ```html <div style ...
- 3个CSS动画库,比Animated还好用,让你的网站酷炫起来
本文首发于https://www.1024nav.com/tools/css-animation-library 转载请注明出处 整理了日常前端开发中常用的css动画库,让你的网页动起来,可以在生成中 ...
- azkaban执行任务长时间无法结束
问题显示: 由于一次执行较多的任务,导致azkaban的web程序崩溃,此时,关闭azkaban服务,重新启动azkaban 但是由于azkaban的exec程序无法关闭,这里采用kill的方式关掉e ...
- R包 tidyverse 分列
代码: 1 library(tidyverse) 2 separate(data = df,col=chr_pos,into=c("chr","pos"),se ...
- MariaDB——显示所有数据库列表
显示所有数据库列表:其中,information_schema.performance_schema.test.mysql,这4个库表是数据库系统自带的表,一般不放数据. 进入某个库 切换库,并显示库 ...
- python基础实战
字符串的互相转换 字典的排序 字典的排序可以直接把,key值或者,values拿出来排序 也可以用dict.items拿出所有的key,value的值再加key=lambda x:x[1] 来排序. ...
- Android系统编程入门系列之硬件交互——多媒体麦克风
在多媒体摄像头及相关硬件文章中,对摄像头的使用方式需要区分应用程序的目标版本以使用不同的代码流程,而与之相比,麦克风硬件的使用就简单多了. 麦克风及相关硬件 麦克风硬件在移动设备上作为音频的采集设备, ...
- windows下 apache 二级域名相关配置 【转】
转至: http://www.th7.cn/Program/php/201306/141305.shtml 今天给大家总结下 windows 下 apache的二级域名的相关配置 下面就利用本地127 ...
- Virtual Destructor
Deleting a derived class object using a pointer to a base class that has a non-virtual destructor re ...
- 用户创建firefox配置文件
1.打开cmd进放 firefox.exe所在的目录 如:D:\>cd D:\Mozilla Firefox 2.运行如命令:D:\Mozilla Firefox>firefox.exe ...