【算法导论】第7章快速排序
1、算法描述
快速排序也是基于分治模式的,下面是一个典型子数组A[p..r]排序的分治过程,主要分为三个步骤:
(1)分解:将数组A[p..r]划分成两个子数组A[p...q-1]和A[q+1...r],使得前一个数组中每个值都小于等于A[q],后一个数组每个值都大于A[q],下标q也在这个分解过程中求得。
(2)解决:通过递归调用对两个子数组分别进行排序。
(3)合并:两个子数组是就地进行排序的,所以他们的合并并不需要操作,这个数组已经有序了。。
2、具体实现:
形参和实参的区别:
(1)实现一:
1 #include<stdio.h> 2 int partition(int *ptr,int p,int r)//一次划分过程 3 { 4 int i,j,temp; 5 int x=*(ptr+r-1); 6 i=p-1; 7 for(j=p;j<r;j++) 8 { 9 if(*(ptr+j-1)<=x) 10 { 11 i++; 12 temp=*(ptr+j-1); 13 *(ptr+j-1)=*(ptr+i-1); 14 *(ptr+i-1)=temp; 15 } 16 } 17 i++; 18 temp=*(ptr+i-1); 19 *(ptr+i-1)=*(ptr+r-1); 20 *(ptr+r-1)=temp; 21 return(i); 22 } 23 void quicksort(int *ptr,int p,int r)//递归排序 24 { 25 int q; 26 if(p<r) 27 { 28 q=partition(ptr,p,r); 29 quicksort(ptr,p,q-1); 30 quicksort(ptr,q+1,r); 31 } 32 } 33 void main() 34 { 35 int a[8]={2,8,7,1,3,5,6,4}; 36 quicksort(a,1,8); 37 for(int i=0;i<8;i++) 38 printf("%d ",a[i]); 39 }
(2)实现二:
1 #include<stdio.h> 2 int partition(int ptr[],int p,int r)//一次划分过程 3 { 4 int i,j,temp; 5 int x=ptr[r-1]; 6 i=p-1; 7 for(j=p;j<r;j++) 8 { 9 if(ptr[j-1]<=x) 10 { 11 i++; 12 temp=ptr[j-1]; 13 ptr[j-1]=ptr[i-1]; 14 ptr[i-1]=temp; 15 } 16 } 17 i++; 18 temp=ptr[i-1]; 19 ptr[i-1]=ptr[r-1]; 20 ptr[r-1]=temp; 21 return(i); 22 } 23 void quicksort(int ptr[],int p,int r)//递归排序 24 { 25 int q; 26 if(p<r) 27 { 28 q=partition(ptr,p,r); 29 quicksort(ptr,p,q-1); 30 quicksort(ptr,q+1,r); 31 } 32 } 33 void main() 34 { 35 int a[8]={2,8,7,1,3,5,6,4}; 36 quicksort(a,1,8); 37 for(int i=0;i<8;i++) 38 printf("%d ",a[i]); 39 }
【算法导论】第7章快速排序相关推荐
- 算法导论 第7章 快速排序 —— 练习还没做,记得补锅
今天来学习第七章--快速排序. 作为占据一章的排序,快速排序可谓是重量级选手. 实际排序中最好的选择,因为 (1) 其平均性能非常好,期望实践复杂度为 O(n lgn); (2) 可进行原址排序; ( ...
- 位向量(bit vector)(算法导论第十一章11.1-2)
位向量(bit vector) 位向量(bit vector)是一个仅包含0和1的数组.长度为m的位向量所占空间要比包含m个指针的数组少得多.说明如何用一个位向量来表示一个包含不同元素(无卫星数据)的 ...
- 假设一动态集合S用一个长度为m的直接寻址表T来表示。请给出一个查找S中最大元素的过程。(算法导论第十一章11.1-1)
假设一动态集合S用一个长度为m的直接寻址表T来表示.请给出一个查找S中最大元素的过程.你所给的过程在最坏情况下的运行时间是多少. (算法导论第十一章11.1-1) #include "Key ...
- 算法导论第2章(3) 二分查找 binary search
二分查找(分治法). 二分查找也是一种分治法的实现,每一次查找将数据分为两个部分,问题规模都减小一半.这样查找的时间复杂度为logN.因为其实查找过程建立了一棵有N个节点的二叉树,查找次数是这棵树的高 ...
- 重读《算法导论》第一章
重读<算法导论> --------算法是程序的灵魂! 驱动力:本人从事开发10年有余,目前正在参与研发自动化编程.在代码解析.自动生成.以及源码分析过程中总会遇到一些算法的问题. 所以想着 ...
- 算法导论第十三章 红黑树
写在前面:这一章真的把我害惨了,之前至少尝试看过3遍,每次看之前都下定决定一定要把它拿下,可是由于内容较多,深度够深,以致于每次要不是中途有什么事放弃了就跳过了,要不是花时间太多仍然不能理解而放弃.这 ...
- 算法导论第16章练习题 16.1-4
16.1-4 假设有一组活动,我们需要将它们安排到一些教室,任意活动都可以在任意教室进行.我们希望使用最少的教室来完成活动.设计一个高效的贪心算法,求每个活动应该在哪个教室来进行. (这个问题也被称为 ...
- 《算法导论》学习笔记——快速排序
快速排序 1.快速排序原理 快速排序是一种应用很广泛的排序算法,与归并排序类似,快速排序也采用了分治策略.对于一个待排序的数组A[p...r]进行快速排序,根据分治思想,可以分为如下三个步骤: ...
- 《算法导论》第九章.中位数和顺序统计量
一.什么是中位数? 在一个n个元素顺序排列的集合中,一个中位数是它所属集合的中点元素. 用公式表达中位数的位置就是: 1.当n为奇数时: i=(n+1)/2; 2.当n为偶数时,有两个中位数: i=n ...
- 算法导论 第20章 斐波那契堆
斐波那契堆的定义 参看19章 二项堆我们可以看到对于可合并堆操作,二项堆均有O(lgn)的时间,对于本章将要讨论的斐波那契堆也支持这些操作,而且它有着更好的渐进时间界,对于不涉及元素删除的操作,它有着 ...
最新文章
- Linux技巧总结(个人经验版)
- Observer模式在J2EE中的实现
- VTK:Dijkstra 图形测地线路径用法实战
- mysql约束与外键_MySQL 外键与约束
- std::stack
- CPU高获取其线程ID然后分析
- oracle上浮下浮分析函数_Oracle分析函数简析
- iOS 代码命名规范 及Android 代码命名规范(2)Android
- Struts2——OGNL表达式
- 一文了解caffe框架
- stata--异方差检验
- 极限编程:价值观、原则和实践
- 机器学习实战(七):Ensemble Learning and Random Forests
- 0day安全:软件漏洞分析技术(第2版)pdf
- 静态路由 动态路由 默认路由 默认网关
- C语言:从键盘输入一个整数,分别输出它的个位数、十位数、百位数.....
- 机房装饰实施方案的评审
- vs2017下libcef配置
- Linux Bash漏洞最新最全的修复方法
- 肥任学java - 基本类型(1)
热门文章
- java综合案例_综合实例 - Java House - BlogJava
- matlab padarray函数零,matlab padarray函数
- aix 的c库为什么都是静态库_Linux静态库生成指南
- java 字符串指定编码输出_java对字符的编码处理
- 深入理解 Java 内存模型(一)——基础
- 为何@Autowired注解无法实现第三方类的注入?
- servlet 调用oracle数据库存储过程
- rabbitmq php 自动断开,解决RabbitMQ服务启动自动关闭,访问不了问题
- input file获取文件路径_python 基础 — 整理文件
- 安徽省智慧政务新模式及典型应用