[C] [二分] C语言实现快速排序
为了以防万一有人想不开想手撕快排呢?比如我。
通过快排来理解二分思想
什么是快排?
快排的思想不难,理解好递归很重要。
什么是递归?
递归,就是在运行的过程中调用自己。
构成递归需具备的条件:
- 子问题须与原始问题为同样的事,且更为简单;
- 不能无限制地调用本身,须有个出口,化简为非递归状况处理。
什么是二分?
“一尺之捶,日取其半,万世不竭” 相信你不陌生吧?这是来自《庄子·天下》中惠施的一句名言。说的就是二分(有的时候不得不感慨古人的智慧啊!)
将一项大任务,不断自截两半,调用相同的处理函数分别处理,截到什么时候呢?截到可以解决这个问题为止。
快排的思想
很多时候我们使用二分法,并不知道它的最小单位是多少,为什么会对这个最小的段没有感觉呢?
因为我们需要关注的不过三个点,首,尾,和我们要取到的中点。假设这个中点为i
,下次递归就是left
到i-1
和i+1
到right
搞清楚这三个点之后,具体分到多小了,就不是那么重要了。
接下来我们要关注的就是“退出” 的时机。在快排里,当首尾指针相遇,就是我们该停止的时候。在代码里体现是:
if (l > r)
{return;
}
其中l
是左指针,r
是右指针。
C语言实现快排
#include<stdio.h>int a[100], n;void quicksort(int l, int r)
{int i, j, t, temp;if (l > r){return;}temp = a[l];//基准数i = l;j = r;while (i != j){while (a[j] >= temp && i < j){j--;}while (a[i] <= temp && i < j){i++;}if (i < j){t = a[i];a[i] = a[j];a[j] = t;}}a[l] = a[i];a[i] = temp;quicksort(l, i - 1);quicksort(i + 1, r);
}int main()
{int i, j, t;scanf("%d", &n);for (i = 1; i <= n; i++){scanf("%d", &a[i]);}quicksort(1, n);for (i = 1; i <= n; i++){printf("%d ", a[i]);}return 0;
}/*
11
6 2 1 7 9 3 4 5 10 8 5
*/
运行结果:
[C] [二分] C语言实现快速排序相关推荐
- c语言快速排序案例,什么是快速排序?C语言数组快速排序例子
快速排序(Quick Sort)是一种有效的排序算法.虽然算法在最坏的情况下运行时间为O(n^2),但由于平均运行时间为O(nlogn),并且在内存使用.程序实现复杂性上表现优秀,尤其是对快速排序算法 ...
- 用数据结构c语言写成绩排序,C语言数据结构 快速排序实例详解
C语言数据结构 快速排序实例详解 一.快速排序简介 快速排序采用分治的思想,第一趟先将一串数字分为两部分,第一部分的数值都比第二部分要小,然后按照这种方法,依次对两边的数据进行排序. 二.代码实现 # ...
- c语言实现快速排序函数
c语言实现快速排序 众所周知,快速排序在排序算法中时间复杂度较为低,为O(nlogn),而选择,冒泡等排序的时间复杂度均为O(n^2). 所以,现在我们来用c语言实现快速排序算法. 代码如下: #in ...
- 快速排序c语言实现,快速排序的C语言代码实现
快速排序实质上是对"冒泡排序"的一种改进,整个排序过程可概括为:通过N趟的排序将原本的排序数据分为若干块进行分块排序,而在每趟排序过程中,以指定的关键字将待排数据分别分为比关键字大 ...
- Go语言编程:Go语言实现快速排序算法
前言 今天用Go语言实现下经典排序算法--快速排序算法.主要是学习了Go语言,得用它来干点事情嘛,就用快速排序来练手.在Go语言语法方面,主要用到 切片数组,for循环(Go语言没有while循环), ...
- C语言-排序-快速排序-qsort<stdlib.h>
想到排序,大多数人第一个想到的都是冒泡排序,今天介绍一种函数,叫快速排序qsort函数,在讲这个函数之前,先将冒泡排序(数字)的代码给大家,如果想排序字符串,请大家使用strcmp函数即可 这是C语言 ...
- C语言之——快速排序qsort库函数的讲解
qsort函数C语言编译器函数库自带的排序函数,也叫快速排序函数.之前我写过一篇关于冒泡排序的代码讲解,大家感兴趣的话可以先看一看我对于冒泡排序的讲解. 相比较于冒泡排序,快速排序可以用更加快捷的速度 ...
- C语言qsort快速排序函数详解
直接进入主题,在c语言中qsort函数是用来快速排序的,qsort有4个参数,分别是数组地址,数组元素个数,数组元素字节大小和一个比较数组元素的函数指针.让我来看一下官方给出的使用标准,上图: 让我们 ...
- C语言实现快速排序法(分治法)
title: 快速排序法(quick sort) tags: 分治法(divide and conquer method) grammar_cjkRuby: true --- 算法原理 分治法的基本思 ...
最新文章
- 利用commons-fileupload 上传图片(包含表单数据)
- Sql Server 监控 Job 执行情况
- Ajax乱码解决方案
- python 多进程与多线程配合拷贝文件目录
- Linux系统开机自启流程
- 4 种方法!检查字符串是否为合法的日期格式
- 微软开源软件特征源码分析工具 Application Inspector
- oracle 12 跟踪,Oracle 12C 块修改跟踪(Block chage tracking) 功能
- 2022低压电工考试题及答案
- 用Python玩玩OSMnx包获取道路数据并可视化分析
- ZZULIOJ 1035: 分段函数求值 (Java)
- python怎么撤销_用Python玩转微信(三)—— 查看撤回消息
- Gluster管理命令的总结与归纳
- python你已经是个成熟的软件了_支付宝改自己还花呗表情包_你已经是个成熟的软件系列表情包大全_游戏吧...
- 线性插值、抛物插值、Lagrange插值 | Lagrange拉格朗日插值法(一)
- 《C++ Primer》 chapter 15 TextQuery
- (二)地理信息中对地球的描述-地球的大地水准面、地球椭球体、大地基准面
- html手机和电脑端网页效果相同,关于手机网页和电脑网页相同内容会不会重复收录的问题...
- 段码液晶显示屏为什么要开模呢?
- ROS参数服务器(参数使用详细介绍)