• 数量少(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++之快速排序改进(随机值)的更多相关文章

  1. python产生随机值-random模块

    import random产生随机值的模块random.random() #获取一个随机的浮点值;help(random.random) #查看随机范围:0-1;random.uniform(1,10 ...

  2. js javascript 简易随机值穿插加解密【原】

    适用场景 本方法适用于需要对敏感信息进行加密传输,但加解密要求又不高的场景,因为是前台的javascript加解密,所以其实还是能通过js代码分析出原始值来的. 如果您对信息极其敏感, 比例登录密码这 ...

  3. C-Linux_毫秒级随机值获取

    秒级随机值-常用方法: #include <stdlib.h> #include <stdio.h> #include <stdio.h> #include < ...

  4. js取指定范围随机值【原】

    js取指定范围随机值 <HTML> <HEAD> <meta http-equiv="content-Type"content="text/ ...

  5. TensorFlow随机值函数:tf.random_uniform

    tf.random_uniform 函数 random_uniform( shape, minval=0, maxval=None, dtype=tf.float32, seed=None, name ...

  6. TensorFlow随机值:tf.random_normal函数

    tf.random_normal 函数 random_normal( shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=No ...

  7. Python中random模块在主函数中设置随机种子是否对于调用的函数中的随机值产生影响?

    一个问题,加入我有一个工程文件,在main函数里面调用random模块,设置随机种子,主函数中的随机种子的设置是否会影响主函数所调用的函数中的随机值? 实际上这个问题非常重要,比如你在跑网络的时候,初 ...

  8. loadRunner之参数化,对用户名和密码进行参数化,并打印输出---实际操作:用户登录的账号用随机值来登录

    录制脚本,对用户名和密码进行参数化: Action() { web_url("WebTours", "URL=http://127.0.0.1:1080/WebTours ...

  9. go 实现每次生成不同随机值

    直接使用rand.Intn(10) 多次运行发现每次的随机值都是一样的 查看 Intn方法的源码说明 // Intn returns, as an int, a non-negative pseudo ...

随机推荐

  1. cookie的生命周期、访问限制、作用域、prefixes

    cookie的生命周期 cookie的生命周期可以通过两种方式定义: 会话期cookie是最简单的cookie:浏览器关闭后会被自动删除.会话期cookie不需要指定过期时间(Expires)或者有效 ...

  2. 简单的Mybatis程序

    1.新建一个普通Maven项目,导入 mybatis.mysql.junit(用于测试)3个依赖 Mybatis <dependency> <groupId>org.mybat ...

  3. The Ultimate Guide to Buying A New Camera

    [photographyconcentrate] 六级/考研单词: embark, thrill, excite, intimidate, accessory, comprehensive, timi ...

  4. 爬虫系列:连接网站与解析 HTML

    这篇文章是爬虫系列第三期,讲解使用 Python 连接到网站,并使用 BeautifulSoup 解析 HTML 页面. 在 Python 中我们使用 requests 库来访问目标网站,使用 Bea ...

  5. 转 序列化Serializable和Parcelable的区别详解

    什么是序列化,为什么要进行序列化 答:对象要进行传输(如:activity 与activity间 ,网络间 进程间等等).存储到本地就必须进行序列化 . 这种可传输的状态就是序列化. 怎么序列化??两 ...

  6. MBean代码例子

    public class ServerImpl { public final long startTime; public ServerImpl() { startTime = System.curr ...

  7. Linux:cut命令...未完待续

    一.定义 正如其名,cut的工作就是"剪",具体的说就是在文件中负责剪切数据用的.cut是以每一行为一个处理对象的,这种机制和sed是一样的. 2.剪切依据 cut命令主要是接受三 ...

  8. lucene中创建索引库

    package com.hope.lucene;import org.apache.commons.io.FileUtils;import org.apache.lucene.document.Doc ...

  9. BigDecimal 中 关于RoundingMode介绍

    RoundingMode介绍 RoundingMode是一个枚举类,有以下几个常量:UP.DOWN.CEILING.FLOOR.HALF_UP.HALF_DOWN.HALF_EVEN.UNNECESS ...

  10. 【手帐】Bullet Journal教程

    最近觉得自己的日程记录本有待提高,于是从今年开始开始入坑了手帐. *内容源自Bullet Journal官网.https://bulletjournal.com/pages/learn 快速笔记 Bu ...