对快速排序的理解以及相关c++代码

快速排序:在一组数据中,可以将左边的数字当作枢轴(右边也可以),接下来要做的就是,先从右边找到比枢轴小的数,

再从左边找到比枢轴大的数,接着将这两个数进行交换,重复上述步骤找出所有符合条件的数进行交换,

最后将枢轴放到比枢轴大的数与比枢轴小的数之间。之所以要从右边开始找,并且找到比枢轴小的数是因为交换后小的数就在枢轴的左边了。

下面举个比较特殊的例子希望能增加理解。


1


9


8


5


6


7


3


2


0


4

先从右往左找到比1小的第一个数字为0,此时的索引位置j=8,再从左往右找到比1大的第一个数字为9,此时的索引位置i=1,此时交换0和9,


1


0


8


5


6


7


3


2


9


4

继续下一次重复任务

先从右往左找到比1小的第一个数字为0,此时的索引位置,j=1,而从左往右找到比1大的第一个数字8此时的索引i=2,很明显i>j,这是不允许的,

所以这时候就可以让所选的枢轴1与j位置上的值交换(也就是把枢轴放到两组数字中间)


0


1


8


5


6


7


3


2


9


4

先看1左边的情况此时就一个数字1已经排好,

再看右边的情况,从j+1的位置开始到最后,且以j+1的位置为枢轴,

从右边找比8小的第一个数字为4,索引j=9,从左边找比8大的第一个数字为9,索引i=8,交换4和9


8


5


6


7


3


2


4


9

按照上述逻辑继续


9


5


6


7


3


2


8


9

8的左边


4


5


6


7


3


2

从右往左找比4小的数字,从左往右找比4大的数字,并交换


4


2


6


7


3


5

继续


4


2


3


7


6


5

继续


3


2


4


7


6


5

8的左边又被4分成两段

8的右边


9

4的左边


3


2


2


3

4的右边


7


6


5

这一次同样以左边为枢轴,从右边找到5,左边会一直找知道找到5所在的位置此时j=i

跳出循环直接把7与j的位置交换,让枢纽7将这3个数分开,实际上7的右边没有值了

只需考虑7的左边


5


6


7

所以最终就排好了


0


1


2


3


4


5


6


7


8


9

以下是c++带模版的快速排序代码

 1 #include <iostream>
 2
 3 using namespace std;
 4
 5 template<class T>
 6 void QuickSort(T *q, int left, int right);
 7
 8 int main()
 9 {
10     int a[]={1,9,8,5,6,7,3,2,0,4};
11     QuickSort(a, 0, 9);
12     for(int i=0; i<10; i++)
13         cout << a[i] << endl;
14     return 0;
15 }
16
17 template<class T>
18 void QuickSort(T *q, const int left, const int right)
19 {
20     if(left<right)
21     {
22         int i=left, j=right;
23         int temp = q[left];
24         while(i<j)
25         {
26             while(q[j]>=temp && i<j)
27             {
28                 j--;
29             }
30             while(q[i]<=temp && i<j)
31             {
32                 i++;
33             }
34             swap(q[i],q[j]);
35         }
36         swap(q[left], q[j]);
37         QuickSort(q, left, j-1);
38         QuickSort(q, j+1, right);
39     }
40 }

原文地址:https://www.cnblogs.com/yang901112/p/11332763.html

时间: 2024-12-18 18:31:40

对快速排序的理解以及相关c++代码的相关文章

uC/OS-II应用程序相关的代码

/***********************************************************************************************************                                                uC/OS-II*                                          The Real-Time Kernel**                     

WordPress作者的相关函数调用代码

WordPress作者的相关函数调用代码,本文参考的是WordPress中文版的维基.网上这样的文章有很多,但是总是不详细或者是有错误,这里的函数是我们经常在使用中要搜索的文章,贴出来给大家了参考. <?php the_author(); ?> 显示文章的作者 <?php the_author_description(); ?> 显示文章作者的描述(作者个人资料中的描述) <?php the_author_login(); ?> 显示文章作者的登录名 <?php

python字符串格式化输出及相关操作代码举例

字符串的格式化 Python 支持格式化字符串的输出 .尽管这样可能会用到非常复杂的表达式,但最基本的用法是将一个值插入到一个有字符串格式符 %s 的字符串中.在   Python 中,字符串格式化使用与 C 中 sprintf 函数一样的语法. 在python中格式化输出字符串通用的形式为: 格式标记字符串 % 要输出的值组 其中,左边部分的"格式标记字符串"可以完全和c中的一致.右边的"值组"如果有两个及以上的值则需要用小括号括起来,中间用逗号隔开. 重点来看左

Unity3D 相关项目代码

一.Application.PresistentDataPath 注意最后面是没有/的 public static string PresistentDataPathForEditor = "C:/Users/Administrator/AppData/LocalLow/DefaultCompany/工程名"; public static string PresistentDataPathForAndroid = "/mnt/sdcard/Android/data/包名/fi

快速排序最新理解

快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个,还有大大小的程序方面的考试如软考,考研中也常常出现快速排序的身影. 总的说来,要直接默写出快速排序还是有一定难度的,因为本人就自己的理解对快速排序作了下白话解释,希望对大家理解有帮助,达到快速排序,快速搞定. 快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序.它采用了一种分治的策

我终于理解了LISP『代码即数据|数据即代码』的含义

以前我一直不能理解LISP里引用的作用,感觉引用和字符串没什么区别.比如:> (define (func) 'ok) > (func) 'ok 这里把引用ok当做了函数func的返回值. 但是我在实现函数式汉语编程的时候,我把代码构造成了一个多叉的语法树,这时候对某一段代码的引用,就是不对代码Eval,直接返回语法树的根节点.类似于: > '(car (a b)) '(car (a b))可是LISP中的引用实际上是一个construct,它可以被car.cdr.即:> (car

[有码有真相]python类私有属性等要点理解及测试示例代码

# encoding: utf-8 ''' 1. python约定类定义中"__"开头(至多一个"_"结尾)的属性为"相对"的私有属性 2. 私有属性在类及其子类定义中是"可见"的,在 其它范围正常访问是相对"不可见"的 3. 留下子类可以修改父类私有属性的口子方便debug测试等 4. 在类定义以外可以通过['_'+className+'私有属性名称']名称访问 5. 私有属性引入是避免类,实例等混淆和冲

java中快速排序的理解以及实例

所谓的快速排序的思想就是,首先把数组的第一个数拿出来做为一个key,在前后分别设置一个i,j做为标识,然后拿这个key对这个数组从后面往前遍历,及j--,直到找到第一个小于这个key的那个数,然后交换这两个值,交换完成后,我们拿着这个key要从i往后遍历了,及i++;一直循环到i=j结束,当这里结束后,我们会发现大于这个key的值都会跑到这个key的后面,不是的话就可能你写错了,小于这个key的就会跑到这个值的前面:然后我们对这个分段的数组再时行递归调用就可以完成整个数组的排序. 用图形法表示由

Maven学习总结(19)——深入理解Maven相关配置

MAVEN2的配置文件有两个settings.xml和pom.xml settings.xml:保存的是本地所有项目所共享的全局配置信息,默认在maven安装目录的conf目录下,如果没有安装maven而是用的m2eclipse插件,那么也可以把这个配置文件放在.m2目录下 pom.xml:描述项目的配置文件,放在每个项目的根目录下 settings.xml localRepository:本地仓库位置,默认在.m2/repository/,可以人为更改 offline:离线开关,是否每次构建都