常见排序算法(三)(快速排序、归并排序、计数排序)

【数据结构】排序算法(快速排序、归并排序、排序算法总结) 这一章节我们继续讲解排序的剩下部分,也是两个比较复杂的排序—快速排序和归并排序,希望大家认真学习,理解透彻~ 阅读详情

相关文章:

常见排序算法(零)(各类排序算法总结与比较)

常见排序算法(一)(冒泡排序、插入排序)

常见排序算法(二)(选择排序)

常见排序算法(三)(快速排序、归并排序、计数排序)

常见排序算法(四)(基数排序、桶排序)


快速排序(Quick Sort)

       快速排序是通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

基本思路:

1、设待排序数组为data

2、设置key = 0,i = 0,j = data.length – 1,从j开始从后往前遍历数组,当找到data[j] < data[key]的数的时候,交换j和key位置的数,让key = j,j递减;然后开始递增i,当找到data[i]>= data[key]时,交换i和key位置的数,让key = i,i递减。

3、当i < j时,重复第二步,直到i == j,此时将数组以i为界分割为两段,一段是[0, i - 1],一段是[i + 1, data.length - 1],对这两段分别进行快速排序,直到不能再分段为止,排序结束。

快速排序的java实现:

iterationSort(0, data.length - 1);
/**
 * 递归的快速排序
 * @param begin 排序的开始位置
 * @param end 排序的结束位置
 */
private void iterationSort(int begin, int end) {
    if (begin >= end) {  //  如果分段中的数小于等于1个,直接返回
        return;
    }
    int top = begin;
    int bottom = end;
    int key = data[top];
    while (top < bottom) {
        while (bottom > top) {
            if (data[bottom] <= key) {  //  注意在这两处判断的地方要有一处有等于号
                swap(top, bottom);
                break;
            }
            bottom--;  //  不管是否发生交换,这里都需要移动
        }
        while (top < bottom) {
            if (data[top] > key) {
                swap(top, bottom);
                break;
            }
            top++;  //  不管是否发生交换,这里都需要移动
        }
    }
    iterationSort(begin, top - 1);  // 递归时记得减1和加1
    iterationSort(top + 1, end);
}

       快速排序的最优时间复杂度为O(nlogn),最差时间复杂度为O(n2),平均时间复杂度为O(nlogn),空间复杂度为O(n)。具有速度快,适用范围广(实数都可以用),使用方便等优点。缺点在于在最差情况下(逆序或者全部相等),时间复杂度很高,达到O(n2)。并且迭代深度过深,容易引发栈溢出错误。


归并排序(Merge Sort)

       归并排序是将待排序数组不停地分段,直到每段中的数只有一个,就开始两两合并,合并的过程中需要开辟一个新数组,用来存放合并后的序列。合并的时候每段从头开始遍历,将两段中最小的数放在前面,然后依次扫描,扫描结束后,如果某一段中还有数据没有扫描到,则直接接到新数组后面,最终得到排好序的序列。

基本思路:

1、递归分段,每次将一段分为两段,直到不能再分为止(段中数的数量为1)

2、合并分段,将返回的段两两合并为一段再返回,直到返回到最上层为止,此时返回的段长度和待排序数组的长度一致。

归并排序的java实现:

data = iterationSort(0, data.length - 1);  //  data为待排序数组
/**
 * 迭代的归并排序
 * @param begin 开始排序的起始位置
 * @param end 结束排序的终止位置
 * @return
 */
private int[] iterationSort(int begin, int end) {
    if (begin >= end) {  //  如果段中数的数量为1,构造一个新数组返回
        return new int[] {data[begin]};
    }
    int middle = (begin + end) / 2;  //  得到中间位置
    //  分别向下递归分段,然后合并
    return merge(iterationSort(begin, middle), iterationSort(middle + 1, end));
}
/**
	 * 合并分段
	 * @param left 第一段(已排好序)
	 * @param right 第二段(已排好序)
	 * @return
	 */
private int[] merge(int[] left, int[] right) {
    int leftLength = left.length;  //  第一段数组长度
    int rightLength = right.length;  //  第二段数组长度
    int[] result = new int[leftLength + rightLength];  //  合并后新数组长度是原来两段数组长度之和
    int counter = 0;  //  用于移动新数组下标
    int leftSign = 0;  //  用于移动第一段数组的下标
    int rightSign = 0;  //  用于移动第二段数组的下标
    while (leftSign < leftLength && rightSign < rightLength) {  //  当两个下标都还在范围内时
        if (left[leftSign] < right[rightSign]) {  //  此时第一段下标位置的数比第二段下标位置的数小
            result[counter] = left[leftSign];  //  将该数复制进新数组
            leftSign++;  //  移动第一段的下标
        } else {  //  此时第一段下标位置的数不比第二段下标位置的数小
            result[counter] = right[rightSign];  //  将该数复制进新数组
            rightSign++;  //  移动第二段的下标
        }
        counter++;  //  移动新数组的下标
    }
    if (leftSign < leftLength) {  //  如果第一段的下标还没有移动到第一段末尾,将剩余的数复制到新数组末端
        for (; leftSign < leftLength; leftSign++, counter++) {
            result[counter] = left[leftSign];
        }
    }
    if (rightSign < rightLength) {  //  如果第二段的下标还没有移动到第二段末尾,将剩余的数复制到新数组末端
        for (; rightSign < rightLength; rightSign++, counter++) {
            result[counter] = right[rightSign];
        }
    }
    return result;  //  返回新数组
}

       归并排序的最优时间复杂度,最差时间复杂度,平均时间复杂度都是O(nlogn),空间复杂度为O(n),是一种稳定的排序算法。优点是时间复杂度稳定,对于各种情况下时间复杂度都达到比较排序算法最优的O(nlogn),在待排序序列分段有序的情况下表现优异。但是需要辅助空间,占用内存,在数据量较大时会占用较多的内存空间。


计数排序(Counting Sort)

       计数排序不是一种基于比较的排序。算法思想是先计算出待排序数组的最大值和最小值的差值,然后创建一个新数组,长度为差值的大小,初始化新数组全部元素为0。计算待排序数组中每个数与最小值的差值,以此差值为下标,新数组此下标位置的元素加1。遍历完之后,从前向后扫描新数组,使每个值为前面所有值之和,此时新数组中的某一下标元素的值代表差值小于等于此下标的待排序数组元素的数量。最后,根据这个数量来放置元素,得到排序后的数组。计数排序是一种不稳定的排序算法。

基本思路:

1、深拷贝待排序数组,得到copyData,查找最小值min,最大值max,得到差值diff= max – min

2、根据diff的大小创建一个计数数组counts,初始化全部元素为0

3、遍历copyData,每个元素与min做差得到一个值,计数数组中对应下标元素加1

4、从前往后遍历计数数组,每个值等于前面所有值之和(处理后的计数数组中每个元素的值代表的含义是待排序数组中差值小于等于此元素下标的数量,例如counts[10] = 100代表待排序数组中与min做差小于等于10的数有100个)

5、向待排序数组中放置数值,放置的方法为:遍历copyData,取出每个数后做差,得到差值min’,假设counts[min’] = 50,那么,这个数应该放在待排序数组中的第49位(因为数组下标从0开始计数,所以要减1),然后counts[min’]递减。(可以预见到,下一个差值为min’的数会被放置在待排序数组中的第48位,两者的相对位置发生了变化,因此计数排序是一种不稳定的排序算法)。以此方法遍历完整个copyData,得到的新的待排序数组就已经排好序了。

计数排序的java实现:
int[] copyData = Arrays.copyOf(data, data.length);
int min = copyData[0];
int max = copyData[0];
//  获得最大最小值
for (int x : copyData) {
    if (x > max) {
        max = x;
        continue;
    }
    if (x < min) {
        min = x;
    }
}

int[] counts = new int[max - min + 1];
Arrays.fill(counts, 0);
//  计算数组中每个值和最小值的差,并计数
for (int x : copyData) {
    counts[x - min]++;
}

//  得到数组中大于某个数的值一共有多少个
for (int i = 1; i < counts.length; i++) {
    counts[i] = counts[i] + counts[i - 1];
}
//  根据数量放置值,每放置一个,对应的值的数量减一
for (int i = 0; i < copyData.length; i++) {
    int index = copyData[i] - min;
    data[counts[index] - 1] = copyData[i];
    counts[index]--;
}
       计数排序的时间复杂度为O(n + k),空间复杂度为O(n + k)(空间复杂度查找不到资料,因为所需空间为一个待排序数组的拷贝和一个长度为差值的数组,就猜想了一下可能是这个),在k值较小时,计数排序的表现要优于基于排序的算法(基于排序算法的最低时间复杂度为O(nlogn))。不过,计数排序的使用具有局限性,从算法的描述可以看出,待排序数组的元素必须是的整数,涉及小数,计数排序就用不上了。如果待排序元素全部为整数并且最大值和最小值的差值不会过大(上亿的话就需要几亿个字节的辅助存储空间了(以一个整数四个字节来计算)),那么计数排序一般会优于快排等基于比较的排序算法。

本文所使用的java代码已上传至github,为java project:https://github.com/sysukehan/SortAlgorithm.git


W5500+STM32F103C8T6进行TCP通信(modbus) 一路生花一、w5500资料二、modbus通信三、从机代码四、总结五、参考 一、w5500资料 w5500的资料就放在下面了,单纯的客户端和其他模式上面有教程 https://www.aliyundrive.com/s/enPnnZgNtpE 二、modbus通信 Modbus RTU通信时使用的数据帧结构如下图,而Moubus TCP通信的数据帧和这个稍微不一样,没有crc检验,因为tcp本就是一种可靠传输协议 这里是Modbus TCP数据帧 公共功能码定义 三、从机代码 阅读详情

相关推荐

Opencv4.5.1 微信二维码识别功能 QRCode 编译与使用 C++

部分参考:https://mp.weixin.qq.com/s/2GZAJAUPHTXFOKDRv-D21Q 一、下载源码 https://github.com/opencv 二、源码编译 ① 在cmake中添加源码编译路径和生成路径,第一次点击configure。 ② 添加contrib路径 第一次configure后,找到OPENCV_EXTRA_MODULES_PATH,将contrib路径添加进来,注意要具体到modules/,继续configure。 ..

zaibeijixing的专栏 1万+

计数排序详解

计数排序的重点是:将序列中的元素作为键存储在额外的数组空间中,通过遍历来排序

weixin_44713306的博客 1万+

上证指数30年k线图_金融占星简单解读上证指数30年历史行情

阅读此文需要一定的占星基础知识,本人对于金融知识了解甚少,如有描述错误请包涵指正!影响大众事件发展趋势的都是外行星,即木星-冥王星这5颗,由于时间跨度长达30年,绘制社会行星的K线图工作量太大,所以只以时代行星对这30年行情的简单解读作为分享,在今后的短期分析中会逐渐加入社会行星,甚至在个股分析上还会加入个人行星。那即使只绘制时代行星,所展现出来的信息也无法在一张图上画出来,否则太乱难以分辨,所以...

weixin_39831242的博客 1674

“计数”排序

计数排序,是通过统计每一个数字出现的次数,并把它映射到与它自己本身数值相同的下标处,再遍历映射的数组使原数组有序的一种排序方法,计数排序的本质是一种哈希算法,也就是通过建立映射关系来达到排序的目的。

weixin_70056514的博客 6552

手写数字数据集MNIST

文章目录一、 简介二、下载MNIST数据集训练集和测试集的长度输出图像数据和标记数据的形状显示手写数字图片输出数据集中的第1个样本显示图片 一、 简介 MNIST是一个非常有名的手写体数字识别数据集(手写数字灰度图像数据集),在很多资料中,这个数据集都会被用作深度学习的入门样例。 MNIST数据集是由0到9的数字图像构成的。训练图像有6万张,测试图像有1万张。MNIST数据集是NIST数据集的一个子集,它包含了60000张图片作为训练数据,10000张图片作为测试数据。由250个不同的人手写而成。 每一张图

qq_37289115的博客 1万+

Windows中的TLS 1.2启用方法(IIS、C#、.Net framework)

折腾几天了windows中的tls1.2启用方法!特此记录一下 开发背景: 在一个用.net framework 2.0开发的客户端程序里面嵌入功能调用第三方物联网相关接口,服务器上有一个restful接口用于接收第三方上报的数据及处理,最后再调用第三方的物联网相关接口。本机开发环境Windows 10,客户服务器是Windows Server 2008 R2。 第一次写这种物联网相关的接口调用,而且第三方提供的文档比较简单,最基本的报文示例都没。开发环境里面各种摸索一步一个坑,首先在发送HTTP请求前

dl1314ld的博客 1万+

十大排序算法——计数排序

计数排序一. 计数排序介绍二. 计数排序基础版三. 计数排序改进版四. 优化最终版本_空间节省 一. 计数排序介绍 计数排序(Counting sort)是一种稳定的排序算法。计数排序使用一个额外的数组C,其中第i个元素是待排序数组A中值等于i的元素的个数。然后根据数组C来将A中的元素排到正确的位置。它只能对整数进行排序。 算法分析 当输入的元素是n 个0到k之间的整数时,它的运行时间是 O(n + k)。计数排序不是比较排序,排序的速度快于任何比较排序算法。 由于用来计数的数组C的长度取

8432

c++ pcl点云处理(2025 长期更新)

目录1.常用的点云文件2.认识点云的文件格式3.点云的数据结构4.输入输出(IO)5.KD树6.Oc树(八叉树)7.点云可视化8.点云滤波9.点云拟合分割10.点云与图像11.特征点与特征描述及提取12.点云配准13.点云曲面重建

twnkie的博客 2259

排序算法之计数排序

计数排序是一种非比较排序,其核心是将序列中的元素作为键存储在额外的数组空间中,而该元素的个数作为值存储在数组空间中,通过遍历该数组排序。计数排序是非比较排序,时间复杂度是O(n+k),空间复杂度是O(k),是稳定算法。(n表示的是数组的个数,k表示的max-min+1的大小)时间复杂度是O(n+k):通过上面的代码可知最终的计数算法花费的时间是3n+k,则时间复杂度是O(n+k)。空间复杂度是O(k):如果出去最后的返回数组,则空间复杂度是2k,则空间复杂度是O(k)

花&败 5334

YOLO数据集实现数据增强的方法(裁剪、平移 、旋转、改变亮度、加噪声等)

数据集样本太少怎么办?数据集优质图像不够怎么办?如何做到更好的数据预处理?一文带你学会数据增强,还可实现带标签的扩充。

路人贾的博客 4万+

如何解除“无法完成操作 因为文件包含病毒或潜在垃圾软件”

当运行软件遇到“无法完成操作 因为文件包含病毒或潜在垃圾软件”时,如何解决?控制面板-系统和安全-Windows Defender防火墙-自定义设置,将专用网络及公用网络关闭。点击后,选择“病毒和威胁防护”-管理配置。进入安全中心后,选择“病毒和威胁防护”将需要排斥的选项输入后,保存配置即可。2:打开windows安全中心。

笔者从事电信媒体开发多年,愿意将多年的开发经验分享给同行 6万+

计数排序 | Counting Sort

计数排序是一种基于特定范围之间的键的排序技术。它通过计算具有不同键值(散列类型)的对象的数量来工作,然后做一些算术来计算每个对象在输出序列中的位置。O(n),其中 n 是元素的总数。

嗅探网的博客 1752

深度学习工具包 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")

【数据结构】排序算法(二)—>冒泡排序、快速排序、归并排序、计数排序

本篇文章博主将继续带来排序算法实现,主要讲解交换排序思想中的冒泡排序、三种快速排序递归版和一种非递归版,归并排序中的递归版和非递归版,以及计数排序的相关内容,包括逐步优化过程与思路详解,进来包会,不会T我。

℉f的博客 4732

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java中的经典排序算法:快速排序、归并排序和计数排序详解(如果想知道Java中有关快速排序、归并排序和计数排序的知识点,那么只看这一篇就足够了!)

Java中的经典排序算法:快速排序、归并排序和计数排序详解(如果想知道Java中有关快速排序、归并排序和计数排序的知识点,那么只看这一篇就足够了!)

秋刀鱼不做梦的编程日常 5728

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【数据结构】一文带你全面了解排序(下)——冒泡排序、快速排序、归并排序、计数排序

冒泡排序、快速排序、归并排序、计数排序

m0_57388581的博客 1950

【算法】常见排序算法(插入排序、选择排序、交换排序和归并排序)

1.插入排序(直接插入排序 和 希尔排序)、选择排序(直接选择排序 和 堆排序)、交换排序(冒泡排序 和 快速排序)和归并排序 2.重点内容:快速排序(三个版本的算法思路及代码实现 以及 快速排序的复杂度讨论及其优化方法:随机选取基准值 、三数取中选取基准值 和 三路划分)

无限进步!!! 3010

万字总结——常见的八大排序算法(插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序、归并排序、计数排序)

二万字排序总结超详解(图示 + 动图)

m0_73900674的博客 3009

排序算法——归并排序与快速排序

今天总结一下两种性能优秀的排序算法,归并排序与快速排序。 首先,二者都运用了递归和分治的两种重要思想。在这里递归就不做详细介绍。 分治:顾名思义,分而治之,这是在排序中我们非常常见的一种思想,同时也是在其他场景乃至日常生活的优秀解题方法。当我们遇到一个大的难题无从下手时,我们往往都会将其分成几个小块,当我们处理好每个小模块问题后,将其合并,大的问题便能够的以解决。同样,在我们处理排序问题时,也...

weixin_41582192的博客 2万+

【C++】十大排序算法之 归并排序 & 快速排序

排序算法是《数据结构与算法》中最基本的算法之一。

K1_uestc的博客 2003

排序算法之高效排序:快速排序,归并排序,堆排序详解

相较于上一期我讲的冒泡、选择、插入等基础排序,快速排序、归并排序和堆排序凭借更优的时间复杂度,成为处理大规模数据排序任务的首选方案。本文我将深入剖析这三种高效排序算法的原理、实现细节、性能特点及适用场景,助力你掌握它们在实际开发中的应用技巧。

1799

四种常见排序算法的对比和总结 插入排序、归并排序、快速排序、堆排序

这里我们要总结的排序算法主要有4个,分别是插入排序Insertion Sort、归并排序Merge Sort、快速排序Quick Sort、堆排序Heap Sort。 下面是四种排序算法具体介绍的文章。 插入排序: 十分重要的O(n^2)级别排序算法 插入排序-InsertionSort 归并排序: 使用递归和非递归实现 归并排序-MergeSort 快速排序: 快速排序QuickSort-基本实现和简单优化 快速排序优化-随机化快速排序法 快速排序优化-双路快速排序法 Quick Sor

bluebiy的专栏 4746

排序算法:归并排序、快速排序

  相关博客: 排序算法:冒泡排序、插入排序、选择排序、希尔排序 排序算法:归并排序、快速排序 排序算法:桶排序、计数排序、基数排序 排序算法:堆排序 十大排序算法小结 一、归并排序: 1、工作原理: 归并排序的采用分治思想,如果要排序一个数组,我们先把数组从中间分成前后两个部分,然后对前后两个部分分别进行排序,再将排好序的两部分合并在一起,这样整个数组就都有序了。 2、动图演...

张维鹏的博客 2886

【排序算法】归并排序与快速排序

一篇文章教你彻底理解快速排序和归并排序

Lin5200000的博客 2070

常见的排序算法

排序算法可谓数据结构模块中的重中之重,常见的哈希表,二叉树,搜索树/平衡树,位图等数据结构只是处理实际问题的抽象方法,实际在处理接受或生成的数据集时,排序算法显得尤其重要,排序算法家族很庞大,其中包括了冒泡排序,选择排序,插入排序,堆排序,快速排序,归并排序,基数排序,计数排序,希尔排序,箱排序,树型排序等众多算法,每种排序都有各自的特性,没有好坏之分,只有在特定的场景使用合适的排序算法才是上策,单纯的来比显得太过绝对,没有可比性。因为实际需求及各方面条件的限制使得排序算法的可选范围往往只缩小到某一种或某几

Xiao__Tian__的博客 9912

快速排序、归并排序、计数排序

本文介绍这三种非常强大的排序算法,每种算法都有各自的特点、不同的实现方式和优化。其算法在效率和数据处理等等方面都非常的强大。快速排序是一个很有名的排序算法,被C和C++都采用为库函数中标准排序算法的底层代码,快速排序顾名思义它确实很“快”,效率很高。历史上于1962年由Hoare首先提出,是一种基于二叉树结构的交换排序算法,后续有许多大佬对这个算法有过优化,基于其根本思想有多种不同的实现方法。快速排序的根本思想是:任取待排序元素序列的中的某元素作为基准值。

xhyly_9的博客 1159

【基于分治的两大重点排序算法】快速排序、归并排序;特定场景效率极高的排序——计数排序

上一篇博客中介绍了基于比较的排序中的前五种排序 –常见排序算法这次主要介绍两大最常考和也是最重要的排序——快速排序和归并排序。除了这两个排序外,还要介绍一个非基于比较的,好理解的,又在特定场景有奇效的计数排序。能通过LeetCode912排序数组。

StuLearn-LJC的博客 1074
上一篇: 常见排序算法(二)(选择排序)
下一篇: 常见排序算法(四)(基数排序、桶排序)
sysukehan
博客等级 码龄11年 119粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值