快速排序坑挺多的,今天有空记录一下自己的实现,并加上详细的注释和举例

#include<iostream>

using namespace std;

int partion(int num[],int left,int right)
{
int i,j,index,exchage;
index = num[left];
i = left; //由于while (i < j)已经决定了,如果 i = left + 1;而数组只有两个元素且j 指向的元素比较大,如 3 8 那么循环不会执行,最后还把8 和3交换了
j = right;
while (i<j) // 3 7 2 4 下面的sawp 执行后 变成 3 2 7 4 这时候 i 指向7 j指向2, 就不需要再循环了j就是最终位置
{
while(num[i] <= index && i < right) // i < right 是为了处理 100 2 3 4 这样的情况,i 会一直扫描越界,为什么不是 i<= right,因为已经j 在right了,一定会处理那个元素
i++; while(num[j] >= index && j > left) //j > left 是为了处理 -13 2 1 4 这样的情况,j 会一直扫描到-13的左边越界, 注意 j 是 > left, 不是>i 否则 3 8 这种情况就错了
j--; if(i < j)
swap(num[i++],num[j--]);//循环结束三种情况,第一种是 3 7 2 4 第二种是 3 3 1,i == right == j结束了,这时候 i j 肯定在一起,就没有必要交换了
//第三种是 3 7 9 这时候j 因为越界判断失败而退出循环,为什么越界,因为它碰到了第一个元素,这时候不能交换3 和 7 ,因为i 停在了比第一个元素大的地方
} swap(num[left],num[j]);// 从小到大排序注意是 交换 j 和 index 位置! return j;
}
void quick_sort(int num[],int lo,int hi)
{
if (lo<hi)
{
int x = partion(num,lo,hi); //对于 3 8 ,x = 0
quick_sort(num,lo,x-); //0 到 -1 所以要判断lo <= hi 如果是等于
quick_sort(num,x+,hi);//1 到 1,由于只有一个元素8,也没有必要排序了所以上面注释的lo <= hi改成 lo < hi }
}
int main()
{
int a[] = {, , , , };
quick_sort(a,,);
for(i=;i<;i++)
cout << a[i] << endl;
return ;
}

c++实现快速排序详细分析的更多相关文章

  1. ZIP压缩算法详细分析及解压实例解释

    最近自己实现了一个ZIP压缩数据的解压程序,觉得有必要把ZIP压缩格式进行一下详细总结,数据压缩是一门通信原理和计算机科学都会涉及到的学科,在通信原理中,一般称为信源编码,在计算机科学里,一般称为数据 ...

  2. 1125MySQL Sending data导致查询很慢的问题详细分析

    -- 问题1 tablename使用主键索引反而比idx_ref_id慢的原因EXPLAIN SELECT SQL_NO_CACHE COUNT(id) FROM dbname.tbname FORC ...

  3. LinkedList详细分析

    一.源码解析1. LinkedList类定义2.LinkedList数据结构原理3.私有属性4.构造方法5.元素添加add()及原理6.删除数据remove()7.数据获取get()8.数据复制clo ...

  4. android ListView 九大重要属性详细分析、

    android ListView 九大重要属性详细分析. 1.android ListView 一些重要属性详解,兄弟朋友可以参考一下. 首先是stackFromBottom属性,这只该属性之后你做好 ...

  5. C语言中的static 详细分析

    转自:http://blog.csdn.net/keyeagle/article/details/6708077/ google了近三页的关于C语言中static的内容,发现可用的信息很少,要么长篇大 ...

  6. Linux内核OOM机制的详细分析(转)

    Linux 内核 有个机制叫OOM killer(Out-Of-Memory killer),该机制会监控那些占用内存过大,尤其是瞬间很快消耗大量内存的进程,为了 防止内存耗尽而内核会把该进程杀掉.典 ...

  7. Android-Native-Server 启动和注册详细分析

    Android-Native-Server 启动和注册详细分析     以mediaService为实例来讲解: mediaService的启动入口 是一个 传统的  main()函数 源码位置E:\ ...

  8. px,dp,dip,sp,in,mm,pt详细分析

    px,dp,dip,sp,in,mm,pt详细分析 px   :(pixels),屏幕的像素点,不同的设备显示效果相同,一般我们HVGA代表320x480像素,这个用的比较多. dip  :(devi ...

  9. Http Pipeline详细分析(下)

    Http Pipeline详细分析(下) 文章内容 接上面的章节,我们这篇要讲解的是Pipeline是执行的各种事件,我们知道,在自定义的HttpModule的Init方法里,我们可以添加自己的事件, ...

随机推荐

  1. SQL注入浅水攻防

    啥是SQL注入(SQL Injection) 所谓SQL注入就是把SQL命令插入到表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令.在某些表单中,用户输入的内容直接用来构造 (或影响 ...

  2. C# 根据路线点集合动态分段

    /// <summary>         /// 将数据根据起.止点分段,返回结果点集合         /// </summary>         public Obse ...

  3. 如何Windows系统中搭建php环境

    PHP介绍: PHP 独特的语法混合了C.Java.Perl以及PHP自创的语法.它可以比CGI或者Perl更快速地执行动态网页.用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入到HTM ...

  4. JavaScript中的call 和apply的用途以及区别

    apply 接受两个参数,第一个参数指定了函数体内this 对象的指向,第二个参数为一个带下标的集合,这个集合可以为数组,也可以为类数组,apply 方法把这个集合中的元素作为参数传递给被调用的函数: ...

  5. Android 开发环境 —— Eclipse 启动时报错:Error when loading the SDK

    简述: Eclipse 启动时报错:Error when loading the SDK 错误信息: Error when loading the SDK: Error: Error parsing  ...

  6. 无U盘安装Linux openSUSE(通过硬盘安装Linux)

    一.说明 为什么会想着用硬盘安装Linux?只是因为我陆陆续续买了两个U盘,然后它们都丢了,就没再买了.然而现在又想装个openSUSE,没有U盘,只能想办法通过硬盘安装. 记录自己走过的弯路,同时也 ...

  7. ASP.NET Zero--9.一个例子(2)商品分类管理-列表

    1.创建实体类 参考:http://www.cnblogs.com/farb/p/4923137.html 在Core(领域层)项目下新建一个目录Entities,在此目录下新建一个Category类 ...

  8. 数据意识崛起,从企业应用看BI软件的未来发展

    前阵子,和一群企业CIO聊天,希望从甲方角度看看对BI产品的看法.在问及一些成熟企业为何不上BI项目时,大家纷纷表示目前还处于观望状态. 提及BI,大家都觉得有些飘忽,和大数据一样,听着高大上,能真正 ...

  9. quagga源码分析--大内总管zebra

    zebra,中文翻译是斑马,于是我打开了宋冬野的<斑马,斑马>作为BGM来完成这个篇章,嘿嘿,小资一把! zebra姑且戏称它是quagga项目的大内总管. 因为它负责管理其他所有协议进程 ...

  10. DBCP连接池的使用

    1.新建工程 2.导入commons-dbcp commons-logging commons-pool这三个包 3.创建dbcpconfig.properties的文件 实例如下 #连接设置 dri ...