热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

快速排序里的学问:随机化快排

一般来说随机选取枢纽元这种策略非常安全,除非随机数生成器有问题(这不像你所想象的那么罕见),因为随机的枢纽元不可能总在接连不断地产生劣质的分割。另一方面,随机数的生成一般是昂贵的,根本减少不了算法其余部分的平均运行时间。算法与前面《算法导论》里的例子差不多,只是在调用分割Partition时加入一个随机数,具体可以参看

前一篇文章讲到了选择枢纽元的几种方法,其实第二种是随机选择元素作为枢纽元。那么在这篇文章里就实现一个随机化排序

算法与前面《算法导论》里的例子差不多,只是在调用分割Partition时加入一个随机数,具体可以参看程序。

C语言代码为:

#include "stdio.h"
#include "math.h"
#include "stdlib.h"

int num = 10;

void swap(int *a,int *b)
{
    int tmp;
    tmp = *a;
    *a = *b;
    *b = tmp;
}

void PrintArray(int arr[])
{
    int i;
	for(i=0; i 

程序运行结果:

初始数组:79 36 68 39 10 96 59 60 84 21
排序过程:79 36 68 39 10 59 60 21 84 96
随机选择 arr[8](84)
排序过程:21 10 36 39 79 59 60 68 [84] 96
随机选择 arr[2](36)
排序过程:10 21 [36] 39 79 59 60 68 84 96
随机选择 arr[1](21)
随机选择 arr[1](21)
随机选择 arr[2](36)
排序过程:10 21 [36] 39 79 59 60 68 84 96
随机选择 arr[3](39)
随机选择 arr[3](39)
排序过程:10 21 36 [39] 68 59 60 79 84 96
随机选择 arr[7](79)
排序过程:10 21 36 39 60 59 68 [79] 84 96
随机选择 arr[6](68)
排序过程:10 21 36 39 59 60 [68] 79 84 96
随机选择 arr[4](59)
随机选择 arr[4](59)
随机选择 arr[6](68)
随机选择 arr[7](79)
随机选择 arr[8](84)
最后结果:10 21 36 39 59 60 68 79 [84] 96
Process returned 0 (0x0)   execution time : 0.582 s
Press any key to continue.

一般来说随机选取枢纽元这种策略非常安全,除非随机数生成器有问题(这不像你所想象的那么罕见),因为随机的枢纽元不可能总在接连不断地产生劣质的分割。另一方面,随机数的生成一般是昂贵的,根本减少不了算法其余部分的平均运行时间。

比如上面程序的运行结果,可以看到,产生了不少随机数是对排序没有产生有效作用的,而产生这些随机数也耗费了不少时间。当然你也可以选择优化随机数生成器,这样又会引起更多的研究了。

延伸阅读

此文章所在专题列表如下:

  1. 快速排序里的学问:从猜数字开始
  2. 快速排序里的学问:再看看称球问题
  3. 快速排序里的学问:信息熵
  4. 快速排序里的学问:快速排序的过程
  5. 快速排序里的学问:霍尔与快速排序
  6. 快速排序里的学问:霍尔快排的实现
  7. 快速排序里的学问:枢纽元选择与算法效率
  8. 快速排序里的学问:随机化快排

本文地址:http://www.nowamagic.net/librarys/veda/detail/2398,欢迎访问原出处。


推荐阅读
  • 本题要求实现一个名为fun的函数,该函数的功能是从给定的字符串s中移除所有ASCII码为偶数值的字符,并将剩下的字符组成的新字符串存储在由t指向的数组中。 ... [详细]
  • c语言二元插值,二维线性插值c语言
    c语言二元插值,二维线性插值c语言 ... [详细]
  • 编译原理中的语法分析方法探讨
    本文探讨了在编译原理课程中遇到的复杂文法问题,特别是当使用SLR(1)文法时遇到的多重规约与移进冲突。文章讨论了可能的解决策略,包括递归下降解析、运算符优先级解析等,并提供了相关示例。 ... [详细]
  • 电商高并发解决方案详解
    本文以京东为例,详细探讨了电商中常见的高并发解决方案,包括多级缓存和Nginx限流技术,旨在帮助读者更好地理解和应用这些技术。 ... [详细]
  • 使用TabActivity实现Android顶部选项卡功能
    本文介绍如何通过继承TabActivity来创建Android应用中的顶部选项卡。通过简单的步骤,您可以轻松地添加多个选项卡,并实现基本的界面切换功能。 ... [详细]
  • 在Linux系统中,许多应用程序以源代码的形式提供,这给安装带来了挑战。本文旨在介绍一种简化源码软件安装流程的方法,帮助用户更加轻松地完成安装。 ... [详细]
  • PHP面试题精选及答案解析
    本文精选了新浪PHP笔试题及最新的PHP面试题,并提供了详细的答案解析,帮助求职者更好地准备PHP相关的面试。 ... [详细]
  • 实现系统调用
    实现系统调用一、实验环境​本次操作还是基于上次编译Linux0.11内核的实验环境进行操作。环境如下:二、实验目标​通过对上述实验原理的认识,相信 ... [详细]
  • 本文提供了一个使用C语言实现的顺序表区间元素删除功能的完整代码示例。该程序首先初始化一个顺序表,然后根据用户输入的数据进行插入操作,最后根据指定的区间范围删除相应的元素,并输出最终的顺序表。 ... [详细]
  • Android开发:巧妙运用ViewStub写出类似Tab选项卡
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • C#中调用OpenCTM打开.obj三维模型文件
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 深入浅出C语言指针
    指针是C语言中极其重要的数据类型,广泛应用于各种数据结构的表示、数组和字符串的操作以及内存地址的处理。本文将通过实例详细解析指针的基本概念及其应用。 ... [详细]
  • C语言中的指针详解
    1.什么是指针C语言中指针是一种数据类型,指针是存放数据的内存单元地址。计算机系统的内存拥有大量的存储单元,每个存储单元的大小为1字节, ... [详细]
  • Redis:缓存与内存数据库详解
    本文介绍了数据库的基本分类,重点探讨了关系型与非关系型数据库的区别,并详细解析了Redis作为非关系型数据库的特点、工作模式、优点及持久化机制。 ... [详细]
  • 本文详细介绍了在单片机编程中常用的几个C库函数,包括printf、memset、memcpy、strcpy和atoi,并提供了具体的使用示例和注意事项。 ... [详细]
author-avatar
hustjs
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有