C语言:快速排序(详解)
快速排序采用的是两头对比交换
上面这个连接大家可以点进去看看博客李小白大大的图文解释,我觉得这个是对我启发比较大的,对刚接触快速排序的人来说非常友好,很快就可以了解到其中的原理。
然后我的代码稍微和里博客李小白的稍稍有点不一样;
我在敲代码过程中发现快速排序对条件限制非常严格,我认为如果你对在从左到右扫描的时候,和从右到左扫描的时候那个限制条件理解了,说明你对这个快速排序的的代码才算真正会敲了,而不是只会原理这么简单。
①首先第一个比较乱的点是我这个代码再从左到右扫描的时候,while条件限制是没有取等号的,且在我这个代码里面是不能取等号,我里面有注释,是因为不能让左边往右走的时候超过基准这个位置,同理右边也是,不能超过基准mid,所以在左右两边退出各自的小while循环的时候都不会超过基准这个位置,而出去之后,遇到if了交换各自的数值,继续对左右都进行各自继续相向走一步。
②往复之后,最终他们会相遇到mid这个位置,遇到if之后继续相向各走一步,那么有了这个操作之后就不符合大循环while这个条件,退出大循环了。
③退出大循环后,你会发现咱的数组被基准分成了两半,这两半分别进行刚刚那个步骤就可以实现快速排序。
④两边各自进入函数运行到函数最后又会被分成两份,这两份中又各自进入函数,又会继续分,这就是为什么有人说快速排序是二分法。
⑤最后当没得分了,也就是代码中left>right的时候,就会return回来,结束整个函数运行,排序完成。
#include<stdio.h>
void quick_pai(int *, int star, int end);//快速排序
void swap(int *left, int *right);//交换两个数字
int main()
{
/*
*/
int i, j;
int arr[10] = {6,1,2,7,9,3,4,5,10,8};
quick_pai(arr, 0, 9);
for(i = 0; i < 10; i++)
{
printf("%d\t", arr[i]);
}
return 0;
}
void quick_pai(int *arr, int star, int end)
{
int mid;//基准
int left = star;
int right = end;
mid = arr[(left+right)/2];
if(left > right)
{
return;
}
else
{
while(left <= right)
{
while(arr[left] > mid)//不能取等于号,因为这样会使这个数字在遇到mid的时候不会退出,而是再次移动一格才退出 ,不能使他超过mid的这个位置
{
left++;
}
while(arr[right] < mid)//同理不能取等号,用来限制在位移到mid这个的时候不再移动了
{
right--;//4 5 8 9 6 3 5 8 5 8
}
if(left <= right)
//与上面对应的是 这个条件不会使 , 因为上面说了,两个最后都会位移到mid这个位置上,所以左边下标要么小于右边,要么等于,所以这个可以取等号
{
swap(&arr[left], &arr[right]);//如果左边下标小于右边下标则交换
left++;
right--;
}
}
}
if(star < right) quick_pai(arr, star, right);//因为刚刚right--了,往左又移动了一步,所以这个right其实已经小于left了,所以在左边用right
/*对左边排序, 不取等号的原因是在return那里的条件没有取等号,
所以在等于的时候不会返回,所以在传进去的时候就不能取等号,
就不会导致在应该结束的时候不会return回来
*/
if(left < end) quick_pai(arr, left, end);//同理因为 left已经大于right了,所以在右边用left
//对右边排序
}
void swap(int *left, int *right)
{
int t;
t = *left;
*left = *right;
*right = t;
}
C语言:快速排序(详解)的更多相关文章
- 快速排序详解(C语言/python)
快速排序详解 介绍: 快速排序于C. A. R. Hoare在1960年提出,是针对冒泡排序的一种改进.它每一次将需要排序的部分划分为俩个独立的部分,其中一个部分的数比的数都小.然后再按照这个方法对这 ...
- 深入理解C语言 - 指针详解
一.什么是指针 C语言里,变量存放在内存中,而内存其实就是一组有序字节组成的数组,每个字节有唯一的内存地址.CPU 通过内存寻址对存储在内存中的某个指定数据对象的地址进行定位.这里,数据对象是指存储在 ...
- c++、Java、python对应的编译型语言和解释性语言区别详解
1.首先明确一点: 高级语言是不能直接在CPU上运行的.CPU只能处理机器语言,就是黑客帝国里面那个10101010101110的数字流. 那么为了让机器语言能够在CPU上运行,那么就必须将其变成机器 ...
- C语言指针详解
前言 这不是我第一次写关于C指针的文章了,只是因为指针对于C来说太重要,而且随着自己编程经历越多,对指针的理解越多,因此有了本文. 为什么需要指针? 指针解决了一些编程中基本的问题. 第一,指针的使用 ...
- 小程序脚本语言WXS详解
WXS脚本语言是 Weixin Script脚本的简称,是JS.JSON.WXML.WXSS之后又一大小程序内部文件类型.截至到目前小程序已经提供了5种文件类型. 解构小程序的几种方式,其中一种方式就 ...
- C语言正则表达式详解 regcomp() regexec() regfree()详解
标准的C和C++都不支持正则表达式,但有一些函数库可以辅助C/C++程序员完成这一功能,其中最著名的当数Philip Hazel的Perl-Compatible Regular Expression库 ...
- Canny边缘检测算法原理及C语言实现详解
Canny算子是John Canny在1986年提出的,那年老大爷才28岁,该文章发表在PAMI顶级期刊上的(1986. A computational approach to edge detect ...
- Go语言interface详解
interface Go语言里面设计最精妙的应该算interface,它让面向对象,内容组织实现非常的方便,当你看完这一章,你就会被interface的巧妙设计所折服. 什么是interface 简单 ...
- C语言关键字详解
相对于其他语言来说,C语言的关键字算是少的了.在C98中关键子总共只有32个,我们来分析一下每个关键字在C语言中它独特的作用. 1.关于数据类型的关键字 (1) char :声明字符型变量或函数 ( ...
- C语言typeof详解 offsetof
http://blog.chinaunix.net/uid-28458801-id-4200573.html 前言: typeof关键字是C语言中的一个新扩展,这个特性在linux内核中应用非常 ...
随机推荐
- #Trie#洛谷 7717 「EZEC-10」序列
题目 分析 考虑这些关系可以用若干个连通块表示,而可以用一个数异或边权表示, 那么每个连通块有一个生成树,而判断非树边是否合法即可, 那么问题就转换成有多少个数异或任意一个元素均不大于\(k\), 把 ...
- #最大公约数,容斥#洛谷 3166 [CQOI2014]数三角形
题目 分析 总方案就是\(C(n*m,3)\),考虑减掉不合法的方案, 横向\(n*C(m,3)\),纵向\(m*C(n,3)\)再减去斜着的, 对于\((x_1,y_1)(x_2,y_2),x_1& ...
- #网络流,二分#洛谷 3324 [SDOI2015]星际战争
题目 分析 二分答案,然后建图判断可行性 代码 #include <cstdio> #include <cctype> #include <queue> #defi ...
- 全面指南:技术写作与编辑工具 Markdown、Git 研究工具
技术写作工具 在技术写作领域,"工具"是指技术写作者用于创建.管理和发布高质量技术文档的各种软件和应用程序.这包括文字处理器.桌面出版应用程序.XML 编辑器.内容管理系统等等.一 ...
- 医疗BI系统如何使医疗行业完成精细化管理转型?
不久前在北京召开的全国医疗管理工作会议,确定了今年的医疗管理工作重点.会议强调,推动医疗管理改革工作的过程中要对形势.规律准确把握,积极应对可能面临的挑战,以"三个转变.三个提高" ...
- centos环境Jenkins配置war包Tomcat
末尾有软件安装包,自行下载(centos环境) centos JDK Jenkins maven tomcat git myslq nginx 7.9 11.0.19 2.418 3.8.1 9.0. ...
- GPT-3的训练一次成本约为140万美元
训练GPT模型的成本非常高昂,因为它需要大量的计算资源和时间.具体来说,GPT-3的训练成本约为140万美元,对于一些更大的LLM模型,训练成本介于200万美元至1200万美元之间.此外,OpenAI ...
- Mac 修改版本号
修改版本号 在安装某些软件(XCode)的过程中, 系统会提示版本低,需要升级到高版本, 而很多人不想升级而需要安装这些软件, 此时只需将版本号修改成软件安装要求的版本号就可以了. 由于SystemV ...
- 整理ionic 系列——页面生命周期
前言 这是整理ionic的开篇,ionic 就不多介绍了,开发混合app的. 正文 Event Desc ionViewDidLoad 当页面加载的时候触发,仅在页面创建的时候触发一次,如果被缓存了, ...
- bs4、selenium的使用
爬取新闻 # 1 爬取网页---requests # 2 解析 ---xml格式,用了re匹配的 ---html,bs4,lxml... ---json: -python :内置的 -java : f ...