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)实现一:

View Code

 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)实现二:

View Code

 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章快速排序相关推荐

  1. 算法导论 第7章 快速排序 —— 练习还没做,记得补锅

    今天来学习第七章--快速排序. 作为占据一章的排序,快速排序可谓是重量级选手. 实际排序中最好的选择,因为 (1) 其平均性能非常好,期望实践复杂度为 O(n lgn); (2) 可进行原址排序; ( ...

  2. 位向量(bit vector)(算法导论第十一章11.1-2)

    位向量(bit vector) 位向量(bit vector)是一个仅包含0和1的数组.长度为m的位向量所占空间要比包含m个指针的数组少得多.说明如何用一个位向量来表示一个包含不同元素(无卫星数据)的 ...

  3. 假设一动态集合S用一个长度为m的直接寻址表T来表示。请给出一个查找S中最大元素的过程。(算法导论第十一章11.1-1)

    假设一动态集合S用一个长度为m的直接寻址表T来表示.请给出一个查找S中最大元素的过程.你所给的过程在最坏情况下的运行时间是多少. (算法导论第十一章11.1-1) #include "Key ...

  4. 算法导论第2章(3) 二分查找 binary search

    二分查找(分治法). 二分查找也是一种分治法的实现,每一次查找将数据分为两个部分,问题规模都减小一半.这样查找的时间复杂度为logN.因为其实查找过程建立了一棵有N个节点的二叉树,查找次数是这棵树的高 ...

  5. 重读《算法导论》第一章

    重读<算法导论> --------算法是程序的灵魂! 驱动力:本人从事开发10年有余,目前正在参与研发自动化编程.在代码解析.自动生成.以及源码分析过程中总会遇到一些算法的问题. 所以想着 ...

  6. 算法导论第十三章 红黑树

    写在前面:这一章真的把我害惨了,之前至少尝试看过3遍,每次看之前都下定决定一定要把它拿下,可是由于内容较多,深度够深,以致于每次要不是中途有什么事放弃了就跳过了,要不是花时间太多仍然不能理解而放弃.这 ...

  7. 算法导论第16章练习题 16.1-4

    16.1-4 假设有一组活动,我们需要将它们安排到一些教室,任意活动都可以在任意教室进行.我们希望使用最少的教室来完成活动.设计一个高效的贪心算法,求每个活动应该在哪个教室来进行. (这个问题也被称为 ...

  8. 《算法导论》学习笔记——快速排序

    快速排序 1.快速排序原理   快速排序是一种应用很广泛的排序算法,与归并排序类似,快速排序也采用了分治策略.对于一个待排序的数组A[p...r]进行快速排序,根据分治思想,可以分为如下三个步骤:   ...

  9. 《算法导论》第九章.中位数和顺序统计量

    一.什么是中位数? 在一个n个元素顺序排列的集合中,一个中位数是它所属集合的中点元素. 用公式表达中位数的位置就是: 1.当n为奇数时: i=(n+1)/2; 2.当n为偶数时,有两个中位数: i=n ...

  10. 算法导论 第20章 斐波那契堆

    斐波那契堆的定义 参看19章 二项堆我们可以看到对于可合并堆操作,二项堆均有O(lgn)的时间,对于本章将要讨论的斐波那契堆也支持这些操作,而且它有着更好的渐进时间界,对于不涉及元素删除的操作,它有着 ...

最新文章

  1. Linux技巧总结(个人经验版)
  2. Observer模式在J2EE中的实现
  3. VTK:Dijkstra 图形测地线路径用法实战
  4. mysql约束与外键_MySQL 外键与约束
  5. std::stack
  6. CPU高获取其线程ID然后分析
  7. oracle上浮下浮分析函数_Oracle分析函数简析
  8. iOS 代码命名规范 及Android 代码命名规范(2)Android
  9. Struts2——OGNL表达式
  10. 一文了解caffe框架
  11. stata--异方差检验
  12. 极限编程:价值观、原则和实践
  13. 机器学习实战(七):Ensemble Learning and Random Forests
  14. 0day安全:软件漏洞分析技术(第2版)pdf
  15. 静态路由 动态路由 默认路由 默认网关
  16. C语言:从键盘输入一个整数,分别输出它的个位数、十位数、百位数.....
  17. 机房装饰实施方案的评审
  18. vs2017下libcef配置
  19. Linux Bash漏洞最新最全的修复方法
  20. 肥任学java - 基本类型(1)

热门文章

  1. java综合案例_综合实例 - Java House - BlogJava
  2. matlab padarray函数零,matlab padarray函数
  3. aix 的c库为什么都是静态库_Linux静态库生成指南
  4. java 字符串指定编码输出_java对字符的编码处理
  5. 深入理解 Java 内存模型(一)——基础
  6. 为何@Autowired注解无法实现第三方类的注入?
  7. servlet 调用oracle数据库存储过程
  8. rabbitmq php 自动断开,解决RabbitMQ服务启动自动关闭,访问不了问题
  9. input file获取文件路径_python 基础 — 整理文件
  10. 安徽省智慧政务新模式及典型应用