第一、算法描述

快速排序由C. A. R. Hoare在1962年提出,该算法是目前实践中使用最频繁,实用高效的最好排序算法,

快速排序算法是采用分治思想的算法,算法分三个步骤

  1. 从数组中抽出一个元素作为基数v(我们称之为划界元素),一般是取第一个、最后一个元素或中间的元素
  2. 将剩余的元素中小于v的移动到v的左边,将大于v元素移动到v的右边
  3. 对左右两个分区重复以上步骤直到所有元素都是有排序好。

第二、算法实现

/*序列划分函数*/
int partition(int a[], int p, int r) {
int key = a[r];//取最后一个
int i = p - 1;
for (int j = p; j < r; j++)
{
if (a[j] <= key)
{
i++;
//i一直代表小于key元素的最后一个索引,当发现有比key小的a[j]时候,i+1 后交换
exchange(&a[i], &a[j]);
}
}
exchange(&a[i + 1], &a[r]);//将key切换到中间来,左边是小于key的,右边是大于key的值。
return i + 1;
} void quickSort(int a[], int p, int r) {
int position = 0;
if (p<r)
{
position = partition(a,p,r);//返回划分元素的最终位置
quickSort(a,p,position-1);//划分左边递归
quickSort(a, position + 1,r);//划分右边递归
}
} void main() {
int d[] = { 6,4,1,8,7,5 };
cout << "输入数组 { 6,4,1,8,7,5 } " << endl;
quickSort(d, 0, 5);
print_arr(d, 6); }

  两个辅助函数:

void exchange(int * a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
void print_arr(int *a, int size) //打印函数
{
cout << "打印数组:";
for (int i = 0; i<size; i++) //打印数组
{
cout << a[i] << " ";
}
cout << endl << endl;
}

  

  测试输出:

第三、算法图解分析

下面我们来具体分析下程序怎么运行的,

quickSort(d, 0, 5);代表以靠最有一个元素5作为基数,

程序初始化时候p=0,r=5,i=-1,j=0,key=5

通过上图我们观察到:

  1. i逐渐增加,它一直代表着小于key=5的最后一个元素,j也在主键增加,一直到key前面一个元素停止
  2. 此时循环到了最后一个元素7,以5为基数的循环已经结束,此时i=1,a[i+1]=6,交换6和5交换,完成本轮循环

    返回i+1=2,依索引2为分界线拆分2个数组,进入递归循环,执行类似上图操作

第四、总结

快速排序之所以快,相比冒泡排序他的交换是跳跃式的,它的最差时间复杂度是O(N2) 和冒泡一样,但是它的平均时间复杂度是O(nlog2N),是一种就地排序算法,

看了很多别人写的算法介绍,还是觉的不够清晰,于是决定自己写一篇博文,希望能帮助需要的人快速理解,文章中的用图都是自己画的,尊重他人劳动,转载请注明出处,谢谢

c++ 图解快速排序算法的更多相关文章

  1. 排序算法:图解快速排序算法--不超过18行代码Python和JavaScript实现快速排序算法

    快速排序有三大要素 分别是 第一:找基准值--key 第二:分区 第三:比较数字大小 先来看下快速排序流程: 基准值key选取了第一个元素78 基准值是可以任意一个元素 因为选择了最左边的数据,那么就 ...

  2. 快速排序算法 java 实现

    快速排序算法 java 实现 快速排序算法Java实现 白话经典算法系列之六 快速排序 快速搞定 各种排序算法的分析及java实现 算法概念 快速排序是C.R.A.Hoare于1962年提出的一种划分 ...

  3. C# 集合扩展快速排序算法

    /// <summary> /// 对集合进行排序,如 /// List<Person> users=new List<Person>(){.......} /// ...

  4. PHP描述冒泡排序和快速排序算法

    使用PHP描述冒泡排序和快速排序算法,对象可以是一个数组.使用PHP描述顺序查找和二分查找(也叫做折半查找)算法,顺序查找必须考虑效率,对象可以是一个有序数组.写一个二维数组排序算法函数,能够具有通用 ...

  5. 快速排序算法(Java)

    快速排序算法的基本思想是:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另外一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序. class Parti ...

  6. 快速排序算法-C语言实现

    注:本篇内容为翻译,之所以选择这篇进行翻译原因是该文章含有动画,能够更加直观地展示快速排序.同时,可以仔细看一下代码,代码中把结构化的思想给予了更加充分地表现.按照功能进行模块划分的思想得到了彻底地贯 ...

  7. C#快速排序算法基础入门篇

    相信算法对于许多开发人员来说都是一大难点,之所以难,就像设计模式一样,许多人在阅读之后,没有很好地理解,也不愿意动手上机操作,只停留在理论的学习上面,随着时间推移就慢慢淡忘. 有些东西,你可以发明创造 ...

  8. 快速排序算法 Quick sort

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4046189.html 首先随机选择一个轴,并调整数组内各个数字,使得比轴值大的数在轴的右边, ...

  9. PHP实现快速排序算法

    快速排序(Quick Sort)是对冒泡排序的一种改进,属不稳定排序算法,由东尼·霍尔在1962年提出.快速排序基本步骤:从数列中挑出一个元素(一般称为称为“基准”),通过一趟排序将要排序的数据分割成 ...

随机推荐

  1. 阿里云环境搭建CDN内容分发

    1.创建CDN CNAME 指向CDN云厂商地址 2.使用域名转向到CDN云厂商地址 请求过来 通过cnd 分发到不同的服务器  如果有缓存的话 直接走了 CDN也可以实现安全功能,比如CDN实现防止 ...

  2. Spring初学之spring的事务管理注解

    spring的事务管理,本文的例子是:比如你需要网购一本书,卖书的那一方有库存量以及书的价格,你有账户余额.回想我们在编程中要实现买书这样的功能,由于你的账户表和书的库存量表肯定不是同一张数据库表,所 ...

  3. 发布新版本遇见java.lang.ClassNotFoundException

    今天发布新版本到测试环境,服务器在启动时报了java.lang.ClassNotFoundException .刚开始我以为是代码中jar引的不对从而导致找不到相关类,后来在本地试了下发现项目可以正常 ...

  4. STL视频_02

    [01:05]主要讲一下几个要点: 1.模板.函数模板 类模板 以及它们的用法 2.容器.什么是容器 和 容器的分类,各种容器的数据结构 3.容器vector的具体用法,包括迭代器的具体用法 [01: ...

  5. php如何查看扩展是否开启

    php如何查看扩展是否开启 一.总结 一句话总结:php -m 1.查看php已安装扩展命令 ? php -m 2.phpinfo();这是最常用的方法,但那么多扩展一时还真不太好找.? 3.exte ...

  6. java:file文件类

    public class FileDemo { public static File file; public static void main(String args[]) { String s = ...

  7. 184. Department Highest Salary

    问题描述 解决方案 select b.Name Department,a.Name Employee,a.Salary from ( select e1.Salary,e1.Name,e1.Depar ...

  8. css3——transition属性和opacity属性

    [transition-duration] 是一个css3属性,规定完成过度效果需要花费的时间(一秒或毫秒计).语法:transition-duration: time;time :    规定完成过 ...

  9. webdriver处理鼠标右键菜单栏

    selenium中ActionChains类提供了鼠标操作的常用方法,但对于鼠标右键的菜单栏,无论是send_keys(Keys.ARROW_DOWN)还是send_keys("K" ...

  10. map和reduce 个数的设定 (Hive优化)经典

    一.    控制hive任务中的map数:  1.    通常情况下,作业会通过input的目录产生一个或者多个map任务. 主要的决定因素有: input的文件总个数,input的文件大小,集群设置 ...