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内核中应用非常 ...
随机推荐
- #排列组合#CF1550D Excellent Arrays
洛谷传送门 CF1550D 分析 对于excellent的 \(a\) 来说 \(|a_i-i|=x\) 的值是固定的,考虑枚举它 一半正一半负时函数值是最大的,当 \(n\) 为奇数时要分为两种情况 ...
- VS的 x86_64 , x64_86 , x64 , x86 有什么区别
x86 Native Tools Command Prompt - Sets the environment to use 32-bit, x86-native tools to build 32-b ...
- Elasticjob 3.x 最新版本源码解读(含备注源码)
源码地址(含备注):https://gitee.com/ityml/elastic-job-zgc 官方网站: https://shardingsphere.apache.org/elasticjob ...
- RabbitMQ 04 直连模式-Java操作
使用Java原生的方式使用RabbitMQ现在已经较少,但这是基础,还是有必要了解的. 引入依赖. <dependency> <groupId>com.rabbitmq< ...
- Qt + mupdf 显示PDF,支持翻页
使用Qt + mupdf 实现PDF阅读器,支持翻页(上一页.下一页) 思路: PDF阅读器:使用mupdf,将PDF文件拆分成单个page页,将page页转为QImage图像,使用QListWidg ...
- HarmonyOS实践之应用状态变量共享
平时在开发的过程中,我们会在应用中共享数据,在不同的页面间共享信息.虽然常用的共享信息,也可以通过不同页面中组件间信息共享的方式,但有时使用应用级别的状态管理会让开发工作变得简单. 根据不同的使用 ...
- Stage模型深入解读
原文链接:https://mp.weixin.qq.com/s/4Mb5BMw1IgKvqE0Ff9Ts-w,点击链接查看更多技术内容: HarmonyOS 3.1版本(API 9)推出了全新应 ...
- 树模型--ID3算法
基于信息增益(Information Gain)的ID3算法 ID3算法的核心是在数据集上应用信息增益准则来进行特征选择,以此递归的构建决策树,以信息熵和信息增益为衡量标准,从而实现对数据的归纳分类. ...
- 局部区块多个报表 TAB 页切换及局部区块的参数查询
在企业的业务系统中,如何从纷繁复杂的数据中抽丝剥茧看到关键数据信息呢?一个重要的途径就是将企业和各部门运营中关键的 KPI 集中在一起显示,同时尽量省去在企业的各个业务系统中分别查找数据. 下面是我近 ...
- docker搭建kafka集群实践
前言 本文主要介绍了如何通过docker搭建一个可以用于生产环境的kafka集群. kafka集群使用了3个节点,依赖zookeeper进行协调,所以会同时搭建一套3节点的zookeeper集群. 准 ...