快速排序理论---不含源码

  版权声明:本文为博主原创文章,未经博主允许不得转载。

  快速排序的基本的思想是选择一个中轴值,然后将待排序列根据中轴值的大小分成两部分,一部分比关键字小,放在关键字的左边,一部分比关键字大,放在关键字的右边;然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序的序列。

  复杂度:快速排序的平均运行时间为θ(nlogn)。

  快速排序原理图:

  原理:首先,选择一个序列中的节点作为基准,以此基准的数值作为大小比较,然后设置两个变量i,j记录当前的位置下标,同时赋初值 i = 0,j = n-1; j下标从当前序列的位置向左扫描,与基准值急性比较,越过大于基准值的节点(j--),当遇到小于基准值的节点时,扫描停止,交换i和j位置对应的值。如果j和i交换之后,在将 i下标从当前位置向右扫描,同样与基准值进行比较,越过小于基准值的节点。当遇到大于基准值的节点时,扫描停止,交换i和j位置对应的值。然后在从j的当前位置向左扫描重复上述步骤, 然后,继续扫描,直至 i 与 j 相遇为止。扫描和交换的过程结束。这是 i 左边的记录的关键字值都小于基准值,右边的记录的关键字值都不小于基准值。字面上理解有点模糊,下面通过表格详细的演示一下快速排序的过程。

  设待排序列为:49  38  65  97  76 13  27  49

  第一步:初始关键字,这里选择第一个数49,作为基准值。i = 0,j = 7

49 38 65 97 76 13 27 49

  第二步:49 = 49,不需交换位置。 j--, 下一步比较 27 和 49。i = 0, j = 7

49 38 65 97 76 13 27 49

  第三步:27 < 49,左向扫描,交换两个数的位置。 i++, 下一步比较 38 和 49。i=0,j=6

27 38 65 97 76 13 49 49 

  第四步:38 < 49, 右向扫描,小于基准值,不需交换位置。 i++,下一步比较 65 和 49。i=1,j=6

27 38 65 97 76 13 49 49

  第五步:65 > 49, 右向扫描, 大于基准值,交换位置。 j--, 下一步比较 13 和 49。i=2,j=6

27 38 49 97 76 13 65 49

   第六步:13 < 49, 左向扫描,小于基准值,交换位置。i++,下一步比较 97 和 49。i=2,j=5

27 38 13 97 76 49 65 49

  第七步:97 > 49, 右向扫描, 大于基准值, 交换位置。 j--, 下一步比较 49 和 76。i = 3,j = 5

27 38 13 49 76 97 65 49

  第八步:49 < 76,左向扫描, 大于基准值, 位置不需交换。 j--。i = 3,j = 4

27 38 13 49 76 97 65 49

  第九步:此时 i = j = 3.第一趟排序结束。i=3,j=3

27 38 13 49 76 97 65 49

                                  

  第一趟排序的结果为:27,38,13,49,76,97,65,49。之后的再次进行排序,直到序列有序位置。

时间: 2025-01-16 13:23:37

快速排序理论---不含源码的相关文章

希尔排序(shell)理论---不含源码

|   版权声明:本文为博主原创文章,未经博主允许不得转载. 希尔排序,是一个缩小增量排序.它根据步长来进行排序,步长不同可能会产生不同的序列,但是他们的最终结果是相同的,希尔排序的官方理论难以理解,这里就用非官方的解释来阐述. 原理: >1.加入有n个节点的序列,假设希尔排序的步长i,那么我们第一步就是将这n个节点,每隔i个座位为一组,如下所示(步长i要取好): [n1, n1+i] [n2, ni+2] [...........] [nx, nn] >2.然后每一组两两比较,如n1和n1+

c++实现游戏开发中常用的对象池(含源码)

c++实现游戏开发中常用的对象池(含源码) little_stupid_child2017-01-06上传 对象池的五要素: 1.对象集合 2.未使用对象索引集合 3.已使用对象索引集合 4.当前使用量 5.最大使用量 http://download.csdn.net/download/little_stupid_child/9730912

微信公众平台开发-access_token获取及应用(含源码)

微信公众平台开发-access_token获取及应用(含源码)作者: 孟祥磊-<微信公众平台开发实例教程> 很多系统中都有access_token参数,对于微信公众平台的access_token参数,微信服务器判断该公众平台所拥有的权限,允许或者禁止公众平台进行当前的操作. 一.access_token作用及使用场景 (一)access_token的作用 access_token由公众号的AppID和AppSecret组成,所以具有识别公众号的作用. (二)access_token的使用场景

17+个ASP.NET MVC扩展点,含源码{转}

1.自定义一个HttpModule,并将其中的方法添加到HttpApplication相应的事件中!即:创建一个实现了IHttpmodule接口的类,并将配置WebConfig.在自定义的HttpModule中,可以将一个方法注册到HttpApplication的任意一个事件中,在之后执行HttpApplication一些列事件时,按照事件的顺序(事件又按照添加方法先后的顺序)执行注册在事件中的方法! namespace MvcStore.Models { public class Excute

MultiThread(VS2013 MFC多线程-含源码-含个人逐步实现文档)

原文:http://download.csdn.net/download/jobfind/9559162 MultiThread(VS2013 MFC多线程-含源码-含个人逐步实现文档).rar

Javaweb实现的优优图书商城(含源码)

原文地址:http://www.cnblogs.com/liaoyu/p/uushop.html 源码地址:https://github.com/liaoyu/uushop 贴出一个大学时做的小项目,供有需要的朋友参考,名为优优图书商城,下面为关于它的一些介绍 主要功能介绍: 用户注册.登录.个人信息管理.通过邮件找回密码 图书搜索.购买.在线浏览,购物车管理 后台echart图表显示.源代码在线编辑 主要技术: 数据库 : mysql 后台语言: Java 后台框架: Hibernate Sp

手把手教你从最基本的Java工程搭建SpringMVC+SpringDataJPA+Hibernate(含源码下载)

转载请注明出处:http://blog.csdn.net/anxpp/article/details/51415366,谢谢! 本文会介绍从一个最基本的java工程,到Web工程,到集成Spring.SpringMVC.SpringDataJPA+Hibernate. 平时我们可能是通过一个模板搭建一个工程,或者是直接导入一个项目,而本文选择从最基本的java工程开始,目的是为了展示更多原理. 当然,我们还是从一个最基本的Maven工程开始,其实普通的非Maven工程,搭建过程几乎是一模一样的,

C++ TinyXml操作(含源码下载)

前言 TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译,使用TinyXML进行C++ XML解析,使用简单,容易上手.这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树. DOM模型即文档对象模型,是将整个文档分成多个元素(如书.章.节.段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系. TinyXML介绍 在TinyXML中,根据XML的各种元素来定义了一些类:TiXmlBase

[转] - 使用Qt作窗口截屏(含源码)

截屏(screenshot),就是将屏幕上的东西拷贝下来存成图片文件.介绍的好像有点多余:(,那我们就直接切入正题. QPixmap提供了两个函数grabWidget和grabWindow可以将屏幕上的窗体存成一个QPixmap格式的图片,很容易再将QPixmap存成文件.函数使用很简单,两行代码就可以.QPixmap pixmap = QPixmap::grabWidget(this);//this是调用该函数的QWidget *指针pixmap.save(“widget.png”,”png”