1.基本思想

先从数列中选取一个数为基准数;
       把所有大于基准数的数放在基准数的右边,小于基准数的放在左边;
       对上面的数列以上个基准数为轴,分别对左右两个数列再次递归调用函数选择新的基准数继续比较;

2.算法实现

#include<stdio.h>
int quick(int arry[],int left,int right)
{int key = arry[left];  //取数组的第一个值作为基准数int l = left; //l和r的作用是指针int r = right;int temp;if(l < r){while(l != r) //l和r不相遇时{//先从右边找,直到找到比基准数小的值,指针r停止移动,再从左边找while(arry[r] >= key && l < r) r--;//从左边开始找时,当指针l所指的值大于基准数时停止移动指针while(arry[l] <= key && l < r)l++;if(l < r){temp = arry[l];arry[l] = arry[r];arry[r] = temp;}}arry[left] = arry[l];arry[l] = key;  //当相遇时则执行本句,即将key值与两指针共同所指的值互换位置//此时这组数的基准数key以右都是比key大的,以左都是比key小的quick(arry,left,l-1);   //递归,将key左边的数继续以最左边的数为基准排序quick(arry,l+1,right); //将key右边的数继续以最左边的数为基准排序}return *arry;
}
int main()
{int i;int arry[6] = {4,2,6,3,7,5};quick(arry,0,5);for(i = 0;i < 6;i++)printf("%d",arry[i]);
}

3.算法分析

在本算法中,每次选取的基准数都是数列中最左侧的数,通常选取首元素或最后一个元素作为基准数;
       最优情况是数列分布较为均匀时,这个意思就是在进行第一趟排序后,第一次选取的基准数正好在数列的中心位置,这样就把数列均匀的分布成了两个元素个数相当的数列。若排序的数列为n个,则需要递归lb n次,时间复杂度为O(n lb n)
       最坏情况是,每次所选的基准数为最大或最小的数,这样的话每次经过一趟排序后被划分的两个数列就有一个是空的,另一个数列的长度为原来长度减1,时间复杂度为O(n²)
       平均时间复杂度为O(n lb n)
经过分析我们可以知道,基准数的选取是影响算法性能的关键。

数据结构——C语言实现快速排序算法相关推荐

  1. 【数据结构 | C语言】Dijkstra算法(迪杰斯特拉算法)

    文章目录 一.Dijkstra 算法介绍 二.算法 C语言 三.完整代码 四.示例 一.Dijkstra 算法介绍 Dijkstra算法解决了单源点的最短路径 Dijkstra 算法是贪心算法 步骤: ...

  2. 【 数据结构 | C语言】Kruskal 算法(克鲁斯卡尔算法)

    文章目录 Kruskal 算法介绍 图解说明 Kruskal 算法 C 语言 完整代码(复制粘贴可用) Kruskal 算法介绍 Kruskal算法,即克鲁斯卡尔算法 关于 Prim 算法,可查看博文 ...

  3. Go语言编程:Go语言实现快速排序算法

    前言 今天用Go语言实现下经典排序算法--快速排序算法.主要是学习了Go语言,得用它来干点事情嘛,就用快速排序来练手.在Go语言语法方面,主要用到 切片数组,for循环(Go语言没有while循环), ...

  4. 用C语言实现快速排序算法

    一.快速排序算法(Quicksort) 1. 定义 快速排序由C. A. R. Hoare在1962年提出.快速排序是对冒泡排序的一种改进,采用了一种分治的策略. 2. 基本思想 通过一趟排序将要排序 ...

  5. python 基础代谢率计算_0.数据结构(python语言) 基本概念 算法的代价及度量!!!...

    先看思维导图: *思维导图有点简陋,本着循循渐进的思想,这小节的知识大多只做了解即可. *重点在于算法的代价及度量!!!查找资料务必弄清楚. 零.四个基本概念 问题:一个具体的需求 问题实例:针对问题 ...

  6. 快速排序算法-c语言实现,快速排序算法实现(C语言)(转)

    快速排序算法 的基本思想是:将所要进行排序的数分为左右两个部分,其中一部分的所有数据都比另外一 部分的数据小,然后将所分得的两部分数据进行同样的划分,重复执行以上的划分操作,直 到所有要进行排序的数据 ...

  7. 【经典题】跟着凡人玩转C语言之快速排序算法

  8. java开发C语言编译器:把C实现的快速排序算法编译成jvm字节码

    有了前面一系列的铺垫和准备后,我们终于能走到至关重要的一刻.在本节,我们将用C语言开发快速排序算法,然后利用我们的编译器把它编译成java字节码,让C语言编写的快速排序算法能在java虚拟机上顺利执行 ...

  9. 弗洛伊德算法c语言path,Floyd算法(弗洛伊德算法)

    算法描述: Floyd算法又称为弗洛伊德算法,插点法,是一种用于寻找给定的加权图中顶点间最短路径的算法.从图的带权邻接矩阵A=[a(i,j)] n×n开始,递归地进行n次更新,即由矩阵D(0)=A,按 ...

最新文章

  1. IT公司100题-4-在二元树中找出和为某一值的所有路径
  2. [YTU]_2383 ( 矩形类定义【C++】)
  3. 表的插入、更新、删除、合并操作_18_清空表中记录
  4. Flask-SQLAlchemy的基本使用
  5. CEF加载PPAPI插件
  6. [rtsp]海康IPC监控摄像头远程外网监控配置(DDNS)
  7. NOI题库练习1.5(07)
  8. vue点击按钮跳转页面
  9. 四足机器人--嵌入式硬件设计
  10. Python3-爬虫登录开心网的账号,并且爬取个人主页内容
  11. java实现两个实体类共有字段合二为一
  12. 马未都说收藏:陶瓷篇(1)历史朝代、陶器
  13. 【每日分享】我做程序员那些年犯下的罪,此时此刻我自己的笑出猪叫~
  14. 计算机网络的三种交换方式
  15. 区块链可以减少社会不平等吗?
  16. Mac系统下Cypress使用初体验
  17. OpenCV-趣味小游戏-手掌击球
  18. nekohtml解析html(string或是文件流)
  19. web概念介绍、软件架构、静态资源
  20. 图情论文笔记 | 主题图书馆建设中的若干问题与发展思考(柯平)

热门文章

  1. SQL语句的执行顺序以及流程
  2. 自学软件测试需要多久?怎么自学软件测试?自学软件测试可以找到工作吗?--请看我是怎么走过来的!绝对干货!
  3. java 内嵌chrome_Java嵌入谷歌内核简单浏览器
  4. 在CANoe/CANalyzer中如何截取/分段CAN Log文件(自定义时间段)
  5. Windows ECP技术浅谈
  6. 怎样把任意exe程序注册成windows系统服务
  7. #71 go-ini 配置库评析 by 无闻(unknwon)【 Go 夜读 】
  8. 深度学习实验——蒸馏模型实战(一)
  9. 累乘计算问题(C语言程序设计)
  10. 100集华为HCIE安全培训视频教材整理 | 双向NAT技术