c++实现快速排序详细分析
快速排序坑挺多的,今天有空记录一下自己的实现,并加上详细的注释和举例
#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++实现快速排序详细分析的更多相关文章
- ZIP压缩算法详细分析及解压实例解释
最近自己实现了一个ZIP压缩数据的解压程序,觉得有必要把ZIP压缩格式进行一下详细总结,数据压缩是一门通信原理和计算机科学都会涉及到的学科,在通信原理中,一般称为信源编码,在计算机科学里,一般称为数据 ...
- 1125MySQL Sending data导致查询很慢的问题详细分析
-- 问题1 tablename使用主键索引反而比idx_ref_id慢的原因EXPLAIN SELECT SQL_NO_CACHE COUNT(id) FROM dbname.tbname FORC ...
- LinkedList详细分析
一.源码解析1. LinkedList类定义2.LinkedList数据结构原理3.私有属性4.构造方法5.元素添加add()及原理6.删除数据remove()7.数据获取get()8.数据复制clo ...
- android ListView 九大重要属性详细分析、
android ListView 九大重要属性详细分析. 1.android ListView 一些重要属性详解,兄弟朋友可以参考一下. 首先是stackFromBottom属性,这只该属性之后你做好 ...
- C语言中的static 详细分析
转自:http://blog.csdn.net/keyeagle/article/details/6708077/ google了近三页的关于C语言中static的内容,发现可用的信息很少,要么长篇大 ...
- Linux内核OOM机制的详细分析(转)
Linux 内核 有个机制叫OOM killer(Out-Of-Memory killer),该机制会监控那些占用内存过大,尤其是瞬间很快消耗大量内存的进程,为了 防止内存耗尽而内核会把该进程杀掉.典 ...
- Android-Native-Server 启动和注册详细分析
Android-Native-Server 启动和注册详细分析 以mediaService为实例来讲解: mediaService的启动入口 是一个 传统的 main()函数 源码位置E:\ ...
- px,dp,dip,sp,in,mm,pt详细分析
px,dp,dip,sp,in,mm,pt详细分析 px :(pixels),屏幕的像素点,不同的设备显示效果相同,一般我们HVGA代表320x480像素,这个用的比较多. dip :(devi ...
- Http Pipeline详细分析(下)
Http Pipeline详细分析(下) 文章内容 接上面的章节,我们这篇要讲解的是Pipeline是执行的各种事件,我们知道,在自定义的HttpModule的Init方法里,我们可以添加自己的事件, ...
随机推荐
- 寻找两个已序数组中的第k大元素
寻找两个已序数组中的第k大元素 1.问题描述 给定两个数组与,其大小分别为.,假定它们都是已按照增序排序的数组,我们用尽可能快的方法去求两个数组合并后第大的元素,其中,.例如,对于数组,.我们记第大的 ...
- [置顶] SQL注入安全分析
(一) 应用环境列表 网络互联设备操作系统 序号 操作系统名称 设备名称 脆弱性 1 IOS_路由器_内部_1 route1 2 IOS_路由器_VPN_1 路由器_VPN_1 3 IOS ...
- js中的true,false盲点
上一篇博客提到了一个js的小问题,我当时的解释不太清晰,后面请教胡大大才弄明白js中的处理. js里面检查true和false的过程是这样的: 所以'0'在逻辑判断里面,是被当做true. if('0 ...
- 根据字节码探讨java自增运算符的原理
public class Test { static int x, y; public static void main(String args[]) { x++; myMethod(); Syste ...
- 没有花括号(大括号)的for循环也能正确执行
代码一 for循环没有{}大括号(花括号),在for语句下面是一条语句. for(var i=0;i<3;i++) console.log(1,i); 上面的代码能无误输出: 1 01 11 2 ...
- BTE 增强
BTE的设计思路还是比较简单,和BADI有点类似.在标准程序中留有OPEN_FI的出口(以函数OPEN_FI_PERFORM_event id_type的形式存在),然后提供一个可配置的TABLE,可 ...
- OpenGL的状态机理解
OpenGL是一种状态机模式,比如你用glEnable打开一个状态,在以后的绘图中将一直保留并应用这个状态,除非你调用glDisable及同类函数来改变该状态或程序退出.例如当前颜色是一个状态变量,可 ...
- cocoaPods第三方库使用详解
终端上安装了cocoapods后,打开终端输入下面命令: cd /Users/Sivek_lin/Desktop/AFNTest/AFNTest touch podfile pod search af ...
- JavaEE XML XSL转换(XSLT)
XSL转换(XSLT) @author ixenos 定义: XSL转换机制可以指定将XML文档转换为其他格式的规则,例如,txt纯文本.XHTML或其他任何XML格式. 用途: XSLT通常用来将某 ...
- 最简单的MFC
#include <SDKDDKVer.h> #include <afxwin.h> #include <afxext.h> #include <iostre ...