《算法之美》---快速排序(随机快速排序)

考点总结 软件构造的多维度视图By phases: build- and run-time viewsBy dynamics: moment and period viewsBy levels: code and component views内部/外部的质量指标External quality factors: qualities such as speed or ease of use, whose p... 阅读详情

快速排序是对冒泡排序的一种改进,它使用分治的思想,通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录循环进行排序,以达到整个序列有序的状态。

 

快速排序是C.A.R Hoare在1962年提出的,显然,它是一种分治算法,并且是原地排序算法。快速排序可分为四个步骤:

1)选择杠杆点:在待排序的序列中按照某种方式选取一个元素作为划分的杠杆点。

2)分解:以杠杆点为界,将序列分为两个子序列,其中一个子序列里的所有元素小于等于杠杆点,另一个子序列里的所有元素大于杠杆点。

3)治之:递归对两个子序列进行快速排序。

4)合并:将排好序的两个子序列合并成大序列。

 

快速排序的时间成本取决于分解这一步,分解的好坏将对整个算法的效率产生决定性影响。但分解的好坏取决于杠杆点的选择。下面是标准的序列分解算法:

PARTITION(A, m, n)             //A[m...n]为一个序列

        x<--A[m]                  //A[m]为我们选择的杠杆点

        i<--m

        for j<--m+1   to  n  do

                  if A[j]<=x then

                           i<--i+1

                           Exchange A[i] <--> A[j]

        Exchange A[m] <--> A[i]

        return i;

 

上述算法将子序列A[m…n]以A[m]为界分解为两个子序列:A[m…i-1]和A[i+1…n]。在每一次for循环中,A[m…i]里面的元素都小于等于杠杆点x,A[i+1…j]里面的元素都大于杠杆点x,而A[j+1…n]里面的元素是尚未分解的子序列里的元素。

有了分解算法之后,整个快速排序算法如下:

QUICKSORT(A, p, r)

        if p<r then

                  q <-- PARTITION(A, p, r)

                  QUICKSORT(A, p, q-1);

                  QUICKSORT(A, q+1, r);

 

程序的初始调用为QUICKSORT(A, 1, n)。

 

快速排序最坏情况下时间复杂度是Θ(n2),最好情况下和平均情况下都是Θ(nlogn)。

 

快速排序分解出的子序列是否为空取决于杠杆点与其他元素的相对关系,因此,在使用快速排序的时候,要想保证算法的时间复杂度不被输入序列有意地操控,我们在选择杠杆点的时候就不能是确定性的。如果每次都是随机选择一个元素作为杠杆点,则无论对手进行多少次实验也不能得出任何肯定的结论,自然也就不能有针对性的进行输入数据次序的安排来使我们快排算法总是处于最坏时间复杂度下。


随机化快速排序算法模板如下:

/*

函数名:     quick_sort

功能:       快速排序辅助过程

*/

template <typename T>

void quick_sort (T data[],int frist,int last)

{

        int lower=frist+1;

        int upper=last;

        int t=rand()%(last-frist)+frist;

        std::swap(data[frist], data[t]);

        T& bound=data[frist];

        while (lower<=upper)

        {

                  while (data[lower]<bound)

                  {

                           ++lower;

                  }

                  while (bound<data[upper])

                  {

                           --upper;

                  }

                  if (lower<upper)

                  {

                           std::swap(data[lower], data[upper]);

                           ++lower;

                           --upper;

                  }

                  else

                           ++lower;

        }

        std::swap(data[upper], data[frist]);

        if (frist<upper-1)

                  quick_sort(data, frist, upper-1);

        if (upper+1<last)

                  quick_sort(data, upper+1, last);

}

 

/*

函数名:     QuickSort

功能:       快速排序

模板参数说明:T必须支持小于操作

参数说明:   data待排序数组, size待排序数组大小

前置条件:   data!=NULL, size>0

后置条件:   data按排列

用法:

#include <algorithm>

#include <stdlib.h>

#include <time.h>

int arr[]={10,9,8,4,5,7,6,3,1,4};

QuickSort(arr, 10);

*/

template <typename T>

void QuickSort (T data[],int size)

{

        int i, max;

        if (size<2)

                  return;

        for (i=1, max=0; i<size; ++i)

        {

                  if (data[max]<data[i])

                           max=i;

        }

        std::swap(data[size-1], data[max]);

        srand(time(0));

        quick_sort(data, 0, size-2);

}

 

 

 

/*

函数名:     quick_sort

功能:       快速排序辅助过程

*/

template <typename T, typename Func>

void quick_sort (T data[],int frist,int last, Func& f)

{

        int lower=frist+1;

        int upper=last;

        int t=rand()%(last-frist)+frist;

        std::swap(data[frist], data[t]);

        T& bound=data[frist];

        while (lower<=upper)

        {

                  while (f(data[lower],bound))

                           ++lower;

                  while (f(bound,data[upper]))

                           --upper;

                  if (lower<upper)

                  {

                           std::swap(data[lower], data[upper]);

                           ++lower;

                           --upper;

                  }

                  else

                           ++lower;

        }

        std::swap(data[upper], data[frist]);

        if (frist<upper-1)

                  quick_sort(data, frist, upper-1, f);

        if (upper+1<last)

                  quick_sort(data, upper+1, last, f);

}

 

/*

函数名:     QuickSort

功能:       快速排序

模板参数说明:T元素类型,Func函数对象或指针

参数说明:   data待排序数组, size待排序数组大小,函数对象或指针

前置条件:   data!=NULL, size>0

后置条件:   data按排列

用法:

#include <algorithm>

#include <stdlib.h>

#include <time.h>

bool cmp(int a, int b)

{ return a<b; }

int arr[]={10,9,8,4,5,7,6,3,1,4};

QuickSort(arr, 10, cmp);

*/

template <typename T, typename Func>

void QuickSort (T data[],int size, Func f)

{

        int i, max;

        if (size<2)

                  return;

        for (i=1, max=0; i<size; ++i)

        {

                  if (f(data[max],data[i]))

                           max=i;

        }

        std::swap(data[size-1], data[max]);

        srand(time(0));

        quick_sort(data, 0, size-2, f);

}

 

C++ 快速排序&随机快速排序 学习记录 C++ 快速排序 记录 都是网上的资源,侵删。 今天学习了快速排序算法,它们的时间以及空间复杂度表格: 快速排序(Quicksort)是对冒泡排序的一种改进。 快速排序由C. A. R. Hoare在1960年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进... 阅读详情

相关推荐

数据结构与算法:随机快速排序及随机快速算法

随机快速排序及随机快速算法

2402_89326161的博客 936

关于基于比较的排序算法,时间复杂度“最坏”下界o(nlogn)与“最优”下界o(n)说明

前言            之前在查找基于比较排序算法的时间复杂度时发现,好多博主对“最坏”下界与“最优”下界没有分清,而是默认的把时间复杂度o(nlogn)当成了“最优”下界。这样很是误导大家,影响很不好。所以特此写一篇说明文章,能让大家理解得更透彻。 下界                       所谓“下界”, 顾名思义就是对于一个长度为n的序列所需要的最少比较次数。 最优下界 ...

WFL_Tesla的博客 1万+

随机选择策略的快速排序

/* Subject:计算机算法设计与分析 Title:2.8.2随机选择策略的快速排序 Coder:Hao Class:计科0906 Num:0304090614 Date: Oct 2nd,2011 Programming Language:C++ */ #include using namespace std; //实现随机功能的函数 int Random(int p,int r)

翾昱 2601

快排的递归与非递归实现

最近面试问到的快排非递归和递归,整理了一下,方便自己review。

u013986213的博客 1813

C++版Cesium实战:从OpenGL到3DTiles的全流程开发指南

本文提供了一份C++版Cesium全流程开发指南,详细阐述了如何利用OpenGL和Qt从零构建高性能、可离线部署的三维GIS应用。内容涵盖开发环境搭建、OpenGL渲染引擎初始化、Cesium核心坐标系与场景管理移植,并重点解析了3DTiles数据的解析、异步加载与渲染优化等硬核实战技术,旨在帮助开发者实现与现有C++工业软件的深度集成。

weixin_28077113的博客 164

2023年全国赛C题《 电容电感测量装置》设计报告

参考下面网站的方案参考LCR测试仪,基本工作原理为给DUT加上正弦激励信号,然后测得该DUT两端的电压和流过DUT的电流,即可通过计算得到DUT的性质和参数。对于一个理想电容,电流相位应该超前电容两端电压90°。然而实际的电容存在损耗,可以等效为一个理想电容Cp​和一个理想电阻Rp​的并联,因此电流超前电压的相位将小于90°,这个角度差即为损耗角。假设DUT两端电压V˙Vcosωt,流过DUT的电流为I˙Isinωt−φ。

moerjie的博客 4809

【算法】随机快速排序和随机选择算法

学习一下更简洁的快排以及随机选择算法

Ahaooooooo的博客 1432

傅里叶光学(1)

傅里叶光学,可以看作是通信理论中傅里叶变换等一系列数学思想以及系统理论与光学(主要是衍射光学)相结合的产物关于傅里叶光学的应用领域,本节介绍了成像,当然事实上不可能仅限于成像,经典的还如激光散斑的一些应用,干涉计量,还有傅里叶变换光谱学等等。最后总结一下,傅里叶光学我认为可以看做一个工具,对于任意的系统,它能给出一些数学思想与物理原理进行解释和分析,找出系统的扰动和响应的关系,或者说根据扰动和响应,来研究或者设计一个系统。

m0_53607446的博客 1670

Java算法OJ(7)随机快速排序

哈喽大家好吖,今儿给大家带来算法—随机快速排序相关知识点,废话不多说让我们开始。

2301_81073317的博客 3241

Leaflet 加载天地图完整配置指南:从插件修改到无限缩放(附源码)

本文详细介绍了Leaflet与天地图深度集成的完整配置指南,包括插件修改、无限缩放实现及源码示例。通过解析天地图服务的WMTS协议、双投影支持和密钥机制,帮助开发者突破缩放级别限制,优化地图应用性能,适用于Web地图开发和高精度GIS系统。

weixin_27180827的博客 441

第一章 初识SpringBoot

提供大量的自动配置Spring和第三方库,开发者可以根据项目需求选择相关的starters依赖,而无需手动配置大量的Spring配置文件,开箱即用,无需配置XML,无代码生成。Spring Boot与Spring Cloud等框架集成,为构建微服务提供了强大的支持,并通过Spring Cloud实现服务注册、负载均衡、熔断等功能。本质上讲,Spring Boot就是Spring,它做了那些本应我们去做的Spring Bean配置等工作。以上就是一个简单的Spring Boot应用的创建和运行过程。

Calvin的博客 1581

排序算法——随机快速排序

引言 随机快排是一个非常有意思的排序排序算法,它的算法思想用到了如递归、荷兰国旗问题等诸多元素,还意外的引入了随机性的概念。 以下将逐步总结三个版本的快速排序,由浅入深总结快速排序的经典实现过程。 荷兰国旗问题参考:《荷兰国旗问题》 一、快速排序1.0 在荷兰国旗问题中,我们通过简单的逻辑可以将一个数组分为两个区域或三个区域,但往往需要在题目之初给定一个 target 作为目标数以此划分。 而在快速排序算法中,这个 target 选为排序范围上的最右边的数——arr[R],我们以 R 上的数为

Morty的技术乐园 6482

从点云到舱口尺寸:船甲板舱口检测的算法实现

本文提出了一种从船甲板激光扫描点云中自动检测舱口尺寸的算法。通过数据预处理(降采样、去噪、平面分割)后,采用甲板投影轮廓法将3D点云转换为2D图像,利用双次闭运算解决扫描碎片化问题,通过轮廓树检测内轮廓识别舱口。算法最终能稳定检测出三个主要舱口的长宽尺寸、面积和位置信息,矩形度超过0.89。该方法克服了扫描稀疏和围壁结构复杂的问题,参数可调性强,适用于工程实践。关键创新点在于将舱口识别转化为图像中的"洞"检测,而非直接处理3D几何特征。

点云兔子的博客 146

刷题日志(4)——随机快速排序与随机选择算法

假设存在一片存储<=x的区域,一开始为空,变量a 记录了该区域的边界,当nums[i]<=x,将该元素放到该区域,同时,边界扩大,i++,当nums[i]>x时,区域不动i++,当遍历完成即完成目标。思路:定义两片区域,其边界分别用变量 a,b来存储,如果nums[i]<x,则将该元素放入小于x的区域,并且向右扩,i++,如果nums[i]=x,则i++,而若未命中,出现在>x区域,则<=x区域不管,再次在>x区域选择新x进行划分,之后同理直至找到第K大的数。),遍历完成后即达成目标。经典随机快排的缺点?

qq_51914226的博客 1549

27、VXLAN BGP EVPN网络的自动化部署与运维管理

本文深入探讨了VXLAN BGP EVPN网络从初始配置到运维管理的全生命周期自动化流程,涵盖Day-0设备自动上线、Day-0.5增量变更与连接验证、Day-1覆盖服务配置与计算集成,以及Day-2监控与故障排查。详细介绍了推送与拉取两种配置模型、主流工具如Cisco VTS、NFM、DCNM的功能特点,以及开源自动化工具的应用。通过流程图和命令示例,系统展示了MAC/IP学习、BGP通告和VXLAN封装的验证方法,为构建高效、可扩展的数据中心网络提供了全面的技术指导。

banana的博客 80

极验验证码: 一点即过验证(鼠标轨迹分析)

2、第一个验证接口分析(第一个w值还原) 3、第二个验证接口(第二个w值还原)这里定位w生成跟上篇文章一样,就不展开了;主要分析tt值(鼠标轨迹)的生成逻辑

qq_49268524的博客 1009

[算法]快速排序与随机快速排序

与归并排序一样,快速排序也运用了分治策略,而随机快速排序是对快速排序的一种优化。

hula_hula_的博客 1635

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

快速排序之随机快排

随机快排之C语言 问题: 快速排序大家应该都比较了解了,利用分治法的思想,将原有的数据分成两个部分,递归分治排序。大致有 4 个步骤: 首先设定一个分界值,通过该分界值将数组分成左右两部分。 将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值。 然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以

Indomite的博客 2451

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

随机快速排序(简述和证明)

快速排序算法复习,随即快速排序算法介绍,证明

LuciferXD的博客 3108

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

随机快速排序算法(C语言)

随机快速排序(C语言) 分治法基本思想 将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同。递归的解决这些子问题,然后将各个子问题的解合并得到原问题的解。 快速排序 原链接:https://blog.youkuaiyun.com/haelang/article/details/44496387 快速排序用到了分治思想,同样的还有归并排序。乍看起来快速排序和归并排序非常相似,都是将问题变小,先排序子串,最后合并。不同的是快速排序在划分子问题的时候经过多一步处理,将划分的两组数据划分为一大

Weightlessly的博客 3492

快速排序及随机快速排序算法(附完整代码)

快速排序算法是基于分治策略的另一个排序算法,思想是输入的子数组a[p:r],按以下三个步骤进行排序: 分解(Divide):以a[p]为基准元素将a[p:r]划分成3段a[p:q-1] 、a[q]、a[q+1:r],使a[p:q-1]中任何一个元素小于等于a[p],而a[q+1:r]中任何一个元素大于等于a[q]。下标q在划分过程中确定。 递归求解(Conquer):通过递归调用快速排序算法,分别对a[p:q-1]和a[q+1:r]进行排序 合并(Merge):由于a[p:q-1]和a[q+1:

weixin_44469806的博客 2341

随机快速排序+随机选择算法

注:关于c语言中随机选择的函数rand需注意:rand()%(n)就会随机选取0~n-其头文件是#include(c++中也有自己的随机选择函数库)

2301_80275822的博客 1303

快速排序 与 随机快速排序 算法分析

快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。 快速排序的优点: (1)原址排序,空间复杂度较小。 (2)虽然最坏情况下(有序数组)

hustyangju的足迹 4119

经典快速排序与随机快速排序

文章目录一、经典快速排序(一)、经典快速排序的实现理论(二)、经典快速排序的代码实现(Java)(三)、经典快速排序的时间复杂度二、随机快速排序(一)随机快速排序的实现理论(二)随机快速排序的代码实现(Java)(三)、随机快速排序的时间复杂度 一、经典快速排序 (一)、经典快速排序的实现理论 经典快速排序是用数组的最后一个数(这里记为 x )进行划分。也就是 &amp;lt;x、=x、&amp;gt;x。 有...

liyanan的博客 3037
上一篇: 《算法之美》---堆排序
下一篇: 《算法之美》---次序选择问题
ACE1985
博客等级 码龄17年 1307粉丝 308原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值