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内核中应用非常 ...
随机推荐
- #分层图最短路,Dijkstra#洛谷 4568 [JLOI2011]飞行路线
题目 一个无向图,每条边都有花费,可以有\(k\)次挑选边去除花费的机会,问从指定起点到指定终点的最小花费 分析 考虑用分层最短路完成,也就是在同一层走需要花费,不同层走不用花费,最终走到最底层,然后 ...
- #后缀数组,单调队列#洛谷 2852 [USACO06DEC]Milk Patterns G
题目 给定一个长度为\(n\)的字符串,求出现至少\(k\)次的最长子串长度 分析 由于后缀排序后的LCP才是最长的,既然要求至少\(k\)次, 实际上也就是维护长度为\(k\)的height数组最小 ...
- 知识汇总:查看linux服务器系统命令
要查看Linux服务器的系统信息,你可以使用多种命令来获取不同类型的信息.以下是一些常 用的命令和它们的用途: uname - 显示基本的系统信息 uname -a:显示所有的系统信息,包括内核名称. ...
- Docker学习路线5:在 Docker 中实现数据持久化
Docker 可以运行隔离的容器,包括应用程序和其依赖项,与主机操作系统分离.默认情况下,容器是临时的,这意味着容器中存储的任何数据在终止后都将丢失.为了解决这个问题并在容器生命周期内保留数据,Doc ...
- win7电脑IE浏览器开发人员工具中不能切换浏览器版本
win7电脑 IE浏览器 开发人员工具,不能切换IE版本 这个是IE浏览器的问题,需要安装个微软件东西就可以解决这个问题了.亲测有效 64位下载地址:https://wwi.lanzoui.com/i ...
- Linux(CentOS7.2)安装cnpm
1.安装cnpm npm install -g cnpm --registry=https://registry.npm.taobao.org 2.如下安装成功 /root/node-v10.16.3 ...
- MVC如何创建区域
前言 MVC 划分区域可以为项目成立不同的小模块,方便团队之间开发,与增强项目结构的清晰度. 正文 建立区域: 在areas里面建立区域.,然后填写命名. 然后区域注册即可: 但是这样做依然无法解决项 ...
- django中对模型字段名的限制
Django 对模型的字段名有一些限制: 一个字段的名称不能是 Python 保留字,因为这会导致 Python 语法错误.比如: class Example(models.Model): pass ...
- State 和 Props的理解以及区别
一.state 一个组件的显示形态可以由数据状态和外部参数所决定,而数据状态就是state,一般在 constructor 中初始化 当需要修改里面的值的状态需要通过调用setState来改变,从而达 ...
- python爬虫实战以及数据可视化
需要准备的环境: (1)python3.8 (2)pycharm (3)截取网络请求信息的工具,有很多,百度一种随便用即可. 第一:首先通过python的sqlalchemy模块,来新建一个表. 第二 ...