快速排序 - 一个萝卜一个坑
快速排序 - 一个萝卜一个坑
快速排序算法的通俗理解
quick_sort简单来说就是一种用到递归的分治算法,每一个递归基就是采用拔萝卜填坑的思想。假设有一排大小不同的萝卜,我们想要把萝卜从小到大挖坑进行排列,萝卜太多直接对比压根看不过来,小白兔手上只能一手拿一个萝卜进行对比,我们需要先拔出一个萝卜作为参照物,具体对比步骤如下
①拔出一个萝卜作为参照物,具体第几个随意,为了方便我们拔出第一个,此时留出一个坑。
②从后面往前面对比,发现比手上萝卜大的就跳过(因为是从小到大排列,大萝卜肯定在后面),比手上萝卜小的放到左边参照物的坑里,此时右边留个坑
③再从前往后对比,发现比手上萝卜小的就跳过(小萝卜放前面),比手上萝卜大的放到右边留下的坑里。
④重复上面②③步骤,直至从前往后和从后往前对比的萝卜刚好是同一个,把参照物萝卜埋入这个坑里,这时在这个坑左边的萝卜都比参照物左边的小,在这个坑右边的萝卜都比参照物萝卜大。
⑤递归调用,把参照物萝卜左边和右边的萝卜当做一堆新萝卜,进行上述①②③④的填坑,只到一堆萝卜只有一个,这样萝卜便按顺序从小到大排列了。
快速排序算法的优劣性
优点:快速排序是平均性能最好的算法,其时间复杂度为O(nlogn)。
缺点:
快速排序虽然只用到了一个元素的辅助空间,但是其采用的是递归的思想,需要通过不断的压栈来进行递归。
快速排序属于不稳定排序(不稳定排序即排序时如果两个元素大小相等,但是仍将它们交换的排序方法)。
常见排序的时间复杂度
快速排序的代码实现
#include <stdio.h>void quick_sort(int *buffer, int left,int right)//quick_sort function define {int i = left, j = right;int template_value = buffer[left];//选出第一个萝卜为参照物萝卜if(left<right)//先判断萝卜堆是不是只有一个萝卜{while(i<j)//判断萝卜堆从左到右和从右到左比较到同一个萝卜则比较完{while(template_value<buffer[j]&&i<j)//从后往前比参照物萝卜大的跳过j--;if(i<j)//从后往前比参照物萝卜小的放到前面坑里buffer[i++] = buffer[j];while(template_value>buffer[i]&&i<j)//从前往后比参照物萝卜小的跳过i++;if(i<j)//从前往后比参照物萝卜大的放到后面坑里buffer[j++] = buffer[i];}buffer[i] = template_value;//把参照物萝卜填到最后一个坑里quick_sort(buffer,left,i-1);//将参照物萝卜左边当做一个新萝卜堆递归调用quick_sort(buffer,i+1,right);//将参照物萝卜右边当做一个新萝卜堆递归调用}}int main(int *args, char *argv[]) {int a[10]={9,7,11,2,5,7,59,62,13,0};int i = 0;quick_sort(a,0,9);for(i=0;i<10;i++){printf("%5d", a[i]);}printf("\n", a[i]);return 0; }
测试结果:
快速排序 - 一个萝卜一个坑相关推荐
- C语言:一维数组—一个萝卜一个坑问题
一维数组逻辑挑战-一个萝卜一个坑问题 从键盘输入0-9的五个数,然后输出0-9中那些没有出现过的数 一维数组初始化的两种方式: 1: for (i = 0; i < 10; i++) { a[i ...
- 设计模式六大原则: 一个萝卜一个坑 -- 单一职责原则
形形色色的代码接触多了,越发意识到 面向对象 这个被人说烂却鲜有用好的概念的重要性.之前看了<大话设计模式>也只是匆匆一瞥,没有敲代码或者记博客,这次连着<Android 源码设计模 ...
- 第1节、一个萝卜一个坑——计数排序
1.栗子 期末成绩出来了,大白考了第4名,得了6 分,总分10分,回家妈妈打他了一顿:你看邻居家的孩子考得多好呀! 家长会上,老师要求大家成绩从低到高排序,前三名奖励小红花,大家如何排队呢? 2.准备 ...
- 思维挑战12:一个萝卜一个坑-一维数组
思维挑战12:一个萝卜一个坑-一维数组 随机输入几个0~9内的几个数,输出没有输入的数 //C037 #include <stdio.h> #include <stdlib.h> ...
- 啊哈添柴挑战Java1651. 一个萝卜一个坑
啊哈添柴--挑战 1651. 一个萝卜一个坑 import java.util.Scanner;/*** @author yinglongwu*/ //1651. 一个萝卜一个坑 public cla ...
- 啊哈添柴挑战Java1652. 桶排序练习(一个萝卜一个坑)
啊哈添柴--挑战 1652. 桶排序练习(一个萝卜一个坑) import java.util.Scanner;/*** @author yinglongwu*/ //1652. 桶排序练习(一个萝卜一 ...
- 第三篇:设计模式六大原则: 一个萝卜一个坑 -- 单一职责原则
形形色色的代码接触多了,越发意识到 面向对象 这个被人说烂却鲜有用好的概念的重要性.之前看了<大话设计模式>也只是匆匆一瞥,没有敲代码或者记博客,这次连着<Android 源码设计模 ...
- 职业生涯之“一个萝卜一个坑”
今天带着学习的态度和任务去参加了中科院学生会及中科院青年发展中心承办的就业汇2010开幕式暨首期论坛.希望可以借此机会观摩下论坛的形式及偷师学艺. 整个论坛的流程还是比较完成的,包括了总论坛和分论坛两 ...
- Tomcat应用部署是否要一个萝卜一个坑?
经常有读者在后台向我提问,一些个性化的问题就直接在后台回复了.也有些比较普遍的问题,比如下面这个: 自己的项目有多个应用,这些应用是要部署到同一个 Tomcat 里好,还是多个应用分别部署到不同的 T ...
最新文章
- 人脑动态功能网络连接模式能够鉴别个体并预测其认知功能
- java 编写小工具 尝试 学习(四)
- struts2 ajax请求发现执行action两次原因
- c语言数据结构kmp中next计算,数据结构——关于KMP算法中next函数的详细解析
- crossdomain.xml配置不当的利用和解决办法
- 【HDU - 5017】Ellipsoid(爬山算法,模拟退火,三分)
- vue联动切换搜索域
- javaWEB的三大组件(入门基础总结)
- Mysql大小写敏感问题
- DHCP技术原理详解
- Eclipse无法查看Servlet源代码的解决方案
- 机器学习中的数学系列
- 《CCNA学习指南:Cisco网络设备互连(ICND1)(第4版)》——2.2节理解主机到主机的通信模型...
- 计算机组成与体系结构——存储器分层体系结构
- 最齐全的日用电商设计模板素材,速来收藏
- 美通企业日报 | 爱彼迎成为奥林匹克全球合作伙伴;腾讯理财通运营主体迁至腾富公司...
- 企业出口退税申报系统的Sqlite数据库破解及读写
- 某社区APP完整原型案例
- 笔记:常见的约束问题求解算法——乘子法和Frank-Wolfe算法
- RoboCup3D仿真2019年国赛TC笔记