快排原理

❤️全面图解快速排序,详细图文并茂解析!❤️ 写在前面: 大家好,我是时光。 今天给大家带来的是排序算法中的快速排序。 我采用图解方式讲解,争取写透彻。话不多说,开始! 思维导图: 1,快速排序概念 通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。主要采用分治法和挖坑填数等方法,分治法就是大问题分解成各个小问题,堆小问题求解,使得大问题得以解决。 2,算法思路 我们先搞清楚这个堆排序思想,先把逻辑搞清楚,不着急写代码。 我们首先有一个无序数组,比方说 阅读详情

高快省的排序算法

有没有既不浪费空间又可以快一点的排序算法呢?那就是“快速排序”啦!光听这个名字是不是就觉得很高端呢。

假设我们现在对“6  1  2 7  9  3  4  5 10  8”这个10个数进行排序。首先在这个序列中随便找一个数作为基准数(不要被这个名词吓到了,就是一个用来参照的数,待会你就知道它用来做啥的了)。为了方便,就让第一个数6作为基准数吧。接下来,需要将这个序列中所有比基准数大的数放在6的右边,比基准数小的数放在6的左边,类似下面这种排列:

3  1  2 5  4  6  9 7  10  8

在初始状态下,数字6在序列的第1位。我们的目标是将6挪到序列中间的某个位置,假设这个位置是k。现在就需要寻找这个k,并且以第k位为分界点,左边的数都小于等于6,右边的数都大于等于6。想一想,你有办法可以做到这点吗?

排序算法显神威

方法其实很简单:分别从初始序列“6  1  2 7  9  3  4  5 10  8”两端开始“探测”。先从右往左找一个小于6的数,再从左往右找一个大于6的数,然后交换他们。这里可以用两个变量i和j,分别指向序列最左边和最右边。我们为这两个变量起个好听的名字“哨兵i”和“哨兵j”。刚开始的时候让哨兵i指向序列的最左边(即i=1),指向数字6。让哨兵j指向序列的最右边(即=10),指向数字。

094811yilrz1tkzkvlrriz.png

 

首先哨兵j开始出动。因为此处设置的基准数是最左边的数,所以需要让哨兵j先出动,这一点非常重要(请自己想一想为什么)。哨兵j一步一步地向左挪动(即j--),直到找到一个小于6的数停下来。接下来哨兵i再一步一步向右挪动(即i++),直到找到一个数大于6的数停下来。最后哨兵j停在了数字5面前,哨兵i停在了数字7面前。

095430axy0qkhxxkktkktk.png

095437kdandfxhbtokk2qh.png

现在交换哨兵i和哨兵j所指向的元素的值。交换之后的序列如下:

6  1  2  5  9 3  4  7  10  8

095448k1kevwlz41373e7k.png

095458ejza15wscjv7iw5c.png

到此,第一次交换结束。接下来开始哨兵j继续向左挪动(再友情提醒,每次必须是哨兵j先出发)。他发现了4(比基准数6要小,满足要求)之后停了下来。哨兵i也继续向右挪动的,他发现了9(比基准数6要大,满足要求)之后停了下来。此时再次进行交换,交换之后的序列如下:

6  1  2 5  4  3  9  7 10  8

第二次交换结束,“探测”继续。哨兵j继续向左挪动,他发现了3(比基准数6要小,满足要求)之后又停了下来。哨兵i继续向右移动,糟啦!此时哨兵i和哨兵j相遇了,哨兵i和哨兵j都走到3面前。说明此时“探测”结束。我们将基准数6和3进行交换。交换之后的序列如下:

3  1 2  5  4  6  9 7  10  8

095506uz7e1uuukcblhkxv.png

095514cag5fumuqqg5jnsw.png

095530e0jf6p0y6aaaw2ir.png

到此第一轮“探测”真正结束。此时以基准数6为分界点,6左边的数都小于等于6,6右边的数都大于等于6。回顾一下刚才的过程,其实哨兵j的使命就是要找小于基准数的数,而哨兵i的使命就是要找大于基准数的数,直到i和j碰头为止。

OK,解释完毕。现在基准数6已经归位,它正好处在序列的第6位。此时我们已经将原来的序列,以6为分界点拆分成了两个序列,左边的序列是“3  1 2  5  4”,右边的序列是“9  7  10  8”。接下来还需要分别处理这两个序列。因为6左边和右边的序列目前都还是很混乱的。不过不要紧,我们已经掌握了方法,接下来只要模拟刚才的方法分别处理6左边和右边的序列即可。现在先来处理6左边的序列现吧。

左边的序列是“3  1  2 5  4”。请将这个序列以3为基准数进行调整,使得3左边的数都小于等于3,3右边的数都大于等于3。好了开始动笔吧

如果你模拟的没有错,调整完毕之后的序列的顺序应该是:

2  1  3  5  4

OK,现在3已经归位。接下来需要处理3左边的序列“2 1”和右边的序列“5 4”。对序列“2 1”以2为基准数进行调整,处理完毕之后的序列为“1 2”,到此2已经归位。序列“1”只有一个数,也不需要进行任何处理。至此我们对序列“2 1”已全部处理完毕,得到序列是“1 2”。序列“5 4”的处理也仿照此方法,最后得到的序列如下:
 

1  2  3 4  5  6 9  7  10  8

对于序列“9  7  10  8”也模拟刚才的过程,直到不可拆分出新的子序列为止。最终将会得到这样的序列,如下

1  2  3 4  5  6  7  8 9  10

到此,排序完全结束。细心的同学可能已经发现,快速排序的每一轮处理其实就是将这一轮的基准数归位,直到所有的数都归位为止,排序就结束了。下面上个霸气的图来描述下整个算法的处理过程。

232129ogop8gk0r8y7l70k.png

这是为什么呢?

快速排序之所比较快,因为相比冒泡排序,每次交换是跳跃式的。每次排序的时候设置一个基准点,将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边。这样在每次交换的时候就不会像冒泡排序一样每次只能在相邻的数之间进行交换,交换的距离就大的多了。因此总的比较和交换次数就少了,速度自然就提高了。当然在最坏的情况下,仍可能是相邻的两个数进行了交换。因此快速排序的最差时间复杂度和冒泡排序是一样的都是O(N2),它的平均时间复杂度为O(NlogN)。其实快速排序是基于一种叫做“二分”的思想。我们后面还会遇到“二分”思想,到时候再聊。先上代码,如下

                            
  1. #include <stdio.h> 
  2. int a[101],n;//定义全局变量,这两个变量需要在子函数中使用 
  3. void quicksort(int left,int right) 
  4. { 
  5.     int i,j,t,temp; 
  6.     if(left>right) 
  7.        return; 
  8.                                 
  9.     temp=a[left]; //temp中存的就是基准数 
  10.     i=left; 
  11.     j=right; 
  12.     while(i!=j) 
  13.     { 
  14.                    //顺序很重要,要先从右边开始找 
  15.                    while(a[j]>=temp && i<j) 
  16.                             j--; 
  17.                    //再找右边的 
  18.                    while(a[i]<=temp && i<j) 
  19.                             i++; 
  20.                    //交换两个数在数组中的位置 
  21.                    if(i<j) 
  22.                    { 
  23.                             t=a[i]; 
  24.                             a[i]=a[j]; 
  25.                             a[j]=t; 
  26.                    } 
  27.     } 
  28.     //最终将基准数归位 
  29.     a[left]=a[i]; 
  30.     a[i]=temp; 
  31.                              
  32.     quicksort(left,i-1);//继续处理左边的,这里是一个递归的过程 
  33.     quicksort(i+1,right);//继续处理右边的 ,这里是一个递归的过程 
  34. } 
  35. int main() 
  36. { 
  37.     int i,j,t; 
  38.     //读入数据 
  39.     scanf("%d",&n); 
  40.     for(i=1;i<=n;i++) 
  41.                    scanf("%d",&a[i]); 
  42.     quicksort(1,n); //快速排序调用 
  43.                              
  44.     //输出排序后的结果 
  45.     for(i=1;i<=n;i++) 
  46.         printf("%d ",a[i]); 
  47.     getchar();getchar(); 
  48.     return 0; 
  49. } 
可以输入以下数据进行验证

1061279345108

运行结果是

12345678910

快速排序(Quick sort) 一、简介 快速排序是(Quick sort)是对冒泡排序的一种改进,是非常重要且应用比较广泛的一种高效率排序算法。 二、算法思路 快速排序是通过多次比较和交换来实现排序,在一趟排序中把将要排序的数据分成两个独立的部分,对这两部分进行排序使得其中一部分所有数据比另一部分都要小,然后继续递归排序这两部分,最终实现所有数据有序。 大致步骤如下: 首先设置一个分界值也就是基准值又是也称为监视哨,通过该分界值将数据分割成两部分。 将大于或等于分界值的数据集中到右边,小于分界值的数据集中到左边。一趟排序过后,左边部 阅读详情

相关推荐

SEO黑帽寄生虫快排的生成原理及做法[详解]

SEO黑帽怎么做寄生虫的方法: 上一篇中讲到寄生虫程序xisev23.8下载地址,有需要请点击文章底部进行下载。 这儿说下寄生虫问题!关于小编来说!对寄生虫程序的挑选没啥考究!随手好用就好!最近新出许多寄生虫!各种各样的,说得有多牛逼多牛逼的!其实都是哄人的、哪个在营销自己的产品的时分不把自己的产品说得好一些!难道会告诉我们废物吗?实际上市面上的虫子程序都是把原始版别改版过来的!有的把程序和菜刀软...

nifeng985的博客 8507

快速排序详解

在之前我们已经见识到了一些基础的排序算法,比如冒泡排序,选择排序,插入排序,堆排序,希尔排序了,对于以上的几种排序我们知道希尔排序和堆排序的时间复杂度更小一些,他们的算法优先性对于其他算法还是有很大的差别,而今天我们会介绍一个排序速度如其名的排序--快速排序。快速排序由C. A. R. Hoare在1962年提出,它是一种基于二叉树结构的交换排序算法,它采用了一种分治的策略,通常称其为分治法。

qq_61422622的博客 4万+

算法介绍——快速排序

快速排序 快速排序是最常用的排序算法。 举例说明 假设我们要对 “6 1 2 7 9 3 4 5 10 8” 这 10 个数进行排序。 C代码实现 # 复杂度分析

程序员「阿基米东」的编程之旅 4万+

排序——快速排序(Quick sort)

概况 快速排序(Quick sort)是对冒泡排序的一种改进。快速排序由C. A. R. Hoare在1960年提出。 算法思路 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 快速排序算法通过多次比较和交换来实现排序,其排序流程如下: ......

努力中的老周的专栏 32万+

Anaconda创建python环境常见命令

Anaconda功能庞大,其可以理解为一个工具,也是一个可执行命令。Anaconda可以创建多个python环境,且python环境间相互独立。

m0_59405106的博客 1万+

基于STM32的坐姿矫正与久坐提醒系统 | 保姆式教程 开源可复刻

本项目基于STM32F103C8T6主控,搭配MPU6050六轴姿态传感器、HC-SR04超声波测距模块,完整实现了坐姿矫正与久坐提醒系统的全流程开发,从多传感器数据采集、数字滤波、姿态解算、坐姿判断到多模式提醒,全流程无跳步保姆式拆解,配套逐行注释可直接编译的开源代码,新手跟着步骤一步步操作,就能顺利完成项目复刻

ZhongWeiXiang9的博客 439

浅谈百度SEO快排是什么、原理、如何判断及应对

更多写作与参考学习材料等可登录ZG文库网http://www.zgwenku.com/下载。 前言:以前我说过不准备写这个快排,一是我自己的网站没有操作过所谓的快排 ,二是我并不能像网上很多写的揭秘百度快排(说实话,你都能揭秘的方法了,还真的很有用吗?真正懂的人都在低调赚money)。我只是站在一个小白角度,让更多小白了解下所谓百度快排是什么,以及同行网站是否使用了所谓快排技术,我们自己又...

qq_16229873的博客 7645

C++开发基础之掌握常用的三种异步编程模型

以上是三种常见的C++异步编程模型,每种模型都有其适用的场景和特点。根据具体需求,你可以选择合适的模型来进行异步编程。

dotnet研习社 2177

百度快排是什么、原理、如何判断及应对

本来不准备讲快排,一是我自己的网站没有操作过所谓的快排 ,二是我并不能像网上很多写的揭秘百度快排(说实话,你都能揭秘的方法了,还真的很有用吗?。但是朋友用过,我只是站在一个用户角度,让更多小白了解下所谓百度快排是什么,以及同行网站是否使用了所谓快排技术,我们自己又该如何应对它。 百度SEO快排是什么? 百度SEO快排,百度,大家懂得,就是针对百度做的快排,那有没有搜狗,360等呢,有的。针对谷歌有没有呢,据了解,暂时应该还没有3-7天上首页这么牛逼(这里不是指品牌词,也不是指没人搜的长得不能再长的长长长

SEO是一门艺术 1892

fpga进阶--时序约束

1、基础概念 1.1 建立(setup)/保持(hold)时间 上述的锁存沿会将数据保存下来,但是必须要满足一定的条件: 建立时间Tsu:在时钟有效沿之前,数据必须保持稳定的最小时间; 保持时间Th:在时钟有效沿之后,数据必须保持稳定的最小时间; 1.2 亚稳态(Metastability) 亚稳态是由于违背了触发器的建立和保持时间而产生的,设计中任何一个触发器都有特定的建立和保持时间,在时钟上升沿前后的这段时间窗口内,数据输入信号必须保持稳定。如果信号在这段时间内发生了变化,那么输...

HHH的博客 2443

基于STM32与SimpleFOC实现直流无刷电机开环控制的实战指南

本文提供了一份基于STM32微控制器与SimpleFOC开源库实现直流无刷电机开环控制的详细实战指南。内容涵盖硬件连接、PlatformIO环境搭建、核心代码解析及上电测试,旨在帮助开发者快速验证硬件并理解开环控制的基本原理,为后续实现高性能的闭环FOC控制奠定基础。

xxx12的博客 961

揭秘SEO快排原理

很多的SEOer每天绝大部分的时间都耗在撰写原创文章/伪原创文章以及发布软文外链,更换行业不相关的友链,年复一年,日复一日,关键词的排名依旧排在100名开外-20名以内,心里很是着急。看看同行竞争对手的网站,收录不好,外链不多,索引量不高,域名注册时间短,但是关键词依旧有很好的排名,心里很是难受,这条路我相信是很多的SEOer都走过的路。各位SEOer,读到这里不知道笔者是否戳到了每一位SEOer...

weixin_34247299的博客 9473

CloudCompare二次开发(1)——获取指定高程的所有点

使用CloudCompare插件实现获取点云数据中指定高程的所有点。

点云侠的博客 4735

基2快排原理与代码

来源: 虚拟现实开发者 作者: 樱 日期: 2005-5-27 9:27:09     基2快排实际上是基数排序,因为它速度特别快。是O(n)级的,所以偶叫他基2快排 :)它的基本原理是桶排,不过大家想必知道桶排有多么吃内存....想要排32位的整数需要4GB的BUFFER....恐怖吧~所以只好以时间换空间~减少空间开销,多画一点时间了。基数排序其实就是多趟桶排。什么是基数排序?基数大家都应该知

w9521423的博客 1134

STM32开发 -- 4G模块开发详解(1)

这部分一直再看,资料都已经整理好了,但是一直没有汇总。接下来就详细的看一下,GSM这部分是怎么实现的。

不积跬步,无以至千里 5万+

一种低照度目标检测新策略:IAT集成YOLOv8实现暗光与雾霾环境下的性能优化【附核心实战代码】

随着深度学习和计算机视觉的快速发展,目标检测模型在各个领域中的应用不断扩展,特别是在低照度环境下的视觉任务。YOLOv8作为当前最先进的目标检测模型之一,在高亮度和良好照明条件下表现出色,但在低照度环境下的性能存在一定的不足。为了解决这一问题,我们提出了一种轻量级的低照度图像增强网络(IAT)来改进YOLOv8的暗光检测能力。本篇文章将深入探讨这一创新改进,并附带代码实现,帮助大家更好地理解这一技术的应用和效果。

一键难忘的博客 3501

刷百度下拉那个词与百度快排点击原理是什么?做快排网站降权怎么办?

前言:这是白杨SEO公众号原创第344篇。为什么写这个?因为之前群里有人问百度下拉词原理是什么?还有一些朋友反映说做快排网站严重降权怎么办?今天就来分享一下。 声明:不管是下拉还是快排,白杨SEO均不鼓励,仅供学习了解。 大纲如下: 1、百度下拉词是什么? 2、刷百度下拉词原理是什么? 3、百度快排点击刷词原理是什么? 4、网站做快排导致降权怎么办? 百度下拉词是什么? 百度下拉词,准确说法是百度搜索框搜索关键词下拉出相关关键词。官方叫百度推荐词。比如搜索"白杨SEO",百度搜索下拉如图: 百度搜索下拉出词

白杨SEO的博客 830

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

技术原理_SEO快排技术的原理简述

SEO快排技术的原理是什么?什么是SEO快排技术?快排技术指的是:快速提高网站排名的一种方法,快排技术分为白帽快排技术与黑帽快排技术,通常大家说的快排技术指的是黑帽快排,说白了就是钻搜索引擎的空子。快排技术的原理比较简单,就是利用软件模拟点击,通过虚假流量欺骗搜索引擎而已,目前百度技术有限,并不能完全识别哪些网站使用了快排技术,据行业内部人士透露百度首页的很多网站都是通过快排技术优化上来的,而且随...

weixin_29248653的博客 888

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

快排是什么_揭秘快速排名原理

  什么是快排?   快排,全称快速排名。基本的原理就是通过大量的模拟普通用户在搜索引擎中的点击行为来调整搜索结果中某些页面的点击数据,从而使得搜索引擎调整这些页面的排名,使其能快速的进入到首页的方法或者技术。   快排的依据是什么?   影响网站排名的核心因素有四个:域名、链接、页面质量、用户行为。而快排的依据正是这四大因素之一的“用户行为”,搜索引擎会根据用户的访问过程记录用户点击的搜索结果、停留时间、跳出率等参数,用这些参数来评定这个页面是否可以解决用户需求,进而判断页面的价值,对价值高的页

shuogegegege的博客 6036

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

java 快排_干货文章!揭秘seo快排原理

小编点评:快排的目的就是有排名,有排名就有流量,在如今流量为王的时代有流量就有价值,不过每个站都有自己的定位和方向,获取流量的方式也各不相同,适合自己的路子更重要!众所周知,最近几年互联网行业一直是在风口浪尖,每个站长都在不断的想办法收割流量,在互联网这个领域,当然,最值钱的也还是流量,你网站有流量哪怕你卖矿泉水都会赚到钱,这就是流量所带来的收益。而搜索引擎也一直占据着互联网这个领域的半...

weixin_39755003的博客 647

seo中快排实现原理。

快排,顾名思义就是快速排名,在以前的是没出现这个名词,随着SEO的方法慢慢的完善,这些名词渐渐出现在我们的面前,网上有很多什么百度内部人员排名稳定不K网站,什么的,哪些基本都是假的,百度的员工待遇福利都是很好的,也不至于为了点小手段来毁自己的前程。下面我们来看看,百度一般是根据什么方式来进行排名的?

qwe13600as的博客 212

百度快排是什么原理,百度霸屏如何实现?

一开始我不打算讲快速排序。第一,我没有在我自己的网站上操作过所谓的快速排序,第二,我不能像网上很多人写的那样透露百度快速排序的秘密(说实话,你可以透露秘密方法,真的有用吗?)但是有朋友用过,我只是站在一个用户的角度,让更多的小白了解什么是所谓的百度快速排序,以及同行网站是否使用了所谓的快速排序技术,我们自己应该如何应对。什么是百度SEO快速排名?百度SEO快排,百度,大家懂得,就是针对百度做的快排,那有没有搜狗,360等呢,有的。...

cs57456376的博客 736

灰帽百度快排是什么原理?

通过大数据分析,国内搜索引擎的用户占比量,百度,360.搜狗 是国内占比最高的三大搜索引擎,而百度的用户站整体的百分之80左右,所以国内做seo的企业基本都非常在意关键词在百度的排名高低,百度seo做多了,多数朋友经常会听到一个词,百度快排,那么很多朋友就会很好奇,百度快排是什么优化手段呢?为什么从来没有接触过呢?好的带着这些疑问,今天大表哥就和大家聊一聊,灰帽百度快排是什么原理? 灰帽se...

qq_40581955的博客 1754
上一篇: 最大公约数&最小公倍数
下一篇: 2016第七届蓝桥杯C/C++B组题解
danting1126
博客等级 码龄10年 10粉丝 13原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值