C语言-快速排序算法-原理-详解(完整代码)
目录
原理:
思想
代码:
快排代码详解:
执行结果
原理:
先选择一个数作为 基准值 (这里用的是 第一个数),进行一次排序
然后将所有比'基准值小的数'放在基准值的'左边',
将所有比'基准值大的数'放在基准值的'右边',然后再对两边的,各自'再取一个数作为基准值',然后再次排序(递归[自己调自己])
思想
通过一个基准值,把一组数据分成两个部分(一边小,一边大),然后,在对两个部分,分别找一个基准值,再次进行排序,直至每一个小部分不可再分,所得到的整个数组就成为了有序数组。
代码:
#include <stdio.h>
#include <stdlib.h>#define N 10//快速排序法
int quick_sort(int *a, int low, int high)
{int i = low; //第一位int j = high; //最后一位int key = a[i]; //将第一个数作为基准值-- 先找到一个基准值while (i < j){ while(i < j && a[j] >= key){j--;}a[i] = a[j]; while(i < j && a[i] <= key){i++;}a[j] = a[i];}a[i] = key;if (i-1 > low) {quick_sort(a, low, i-1);}if (i+1 < high){quick_sort(a, i+1, high);}return 0;
} //程序的入口
int main(int argc, const char *argv[])
{//先整了个数组,初始化了一堆数,一共十个,N 宏定义了 10 int a[N] = {1, 3, 5, 7, 9, 2, 4, 6, 8, 0}; int i = 0;printf("排序之前:\n");for(i = 0; i < N; i++){printf("%d ", a[i]);}putchar(10);//换行//调用-快排quick_sort(a, 0, N-1);//数组,0 ,9printf("排序之后:\n");for(i = 0; i < N; i++){printf("%d ", a[i]);}putchar(10);return 0;
}
快排代码详解:
#include <stdio.h>
#include <stdlib.h>#define N 10//快速排序法
int quick_sort(int *a, int low, int high)
{int i = low; //第一位int j = high; //最后一位int key = a[i]; //将第一个数作为基准值-- 先找到一个基准值//进行排序---> 最终结果就是 左面的 都比基准值小 ,右面的都比 基准值大,所以这是所有循环的结束条件while (i < j){//下面的循环执行的条件是 如果右面的比基准值大,就赋一下值,否则继续向前移动//---如果直接把循环写成下面这样---//while(a[j] >= key) //如果下面的不写这个i<j,这个就出错、越界,并且排序不准--理由://如果i<j,并且: 右面的值 大于 基准值 时,j往前移动一个//i 跟 j 的可能情况 只有 i<j i==jwhile(i < j && a[j] >= key)//i<j 是 当前while循环的结束条件,如果没有这个,i会大于j,出现越界,错误 {j--;//继续走}//如果不成立,也就是 a[j] <= key;右面的比key小了,那就换个位置//把a[j]的数据给a[i] a[i] = a[j]; //将事先保存好的基准值与左边的值进行比较,如果基准值大,保持不变,i往前//然后 判断一下这个新的a[i],也就是之前的a[j]跟key值的关系---> 一定是 a[i]<key//所以把i向前移动一下,i++while(i < j && a[i] <= key){i++;}//移动完以后,把新的位置的a[i]的数值 给刚才的 a[j],然后开始下一次循环a[j] = a[i];}//跳出循环,将基准值放入数据a[i]中a[i] = key;//对基准值左边 的所有数据 再次进行快速查找(递归)if (i-1 > low) {quick_sort(a, low, i-1);}//对基准值右边的所有数据再次进行快速查找(递归)if (i+1 < high){quick_sort(a, i+1, high);}return 0;
} int main(int argc, const char *argv[])
{int a[N] = {1, 3, 5, 7, 9, 2, 4, 6, 8, 0};//先整了个数组,初始化了一堆数 int i = 0;printf("排序前:\n");for(i = 0; i < N; i++){printf("%d ", a[i]);}putchar(10);//调用-快排quick_sort(a, 0, N-1);//数组,0 ,9printf("排序后:\n");for(i = 0; i < N; i++){printf("%d ", a[i]);}putchar(10);return 0;
}
执行结果
如果有重复的数据也可以
C语言-快速排序算法-原理-详解(完整代码)相关推荐
- TOPSIS(逼近理想解)算法原理详解与代码实现
写在前面: 个人理解:针对存在多项指标,多个方案的方案评价分析方法,也就是根据已存在的一份数据,判断数据中各个方案的优劣.中心思想是首先确定各项指标的最优理想值(正理想值)和最劣理想值(负理想解),所 ...
- 快速排序算法原理详解
快速排序算法是冒泡排序算法的一种改进,采用"分而治之"的思想,把大的拆分成小的,再把小的拆分成更小的.如:对于一组待排的记录,通过一趟排序后,将原序列分成两部分,其中前一部分的所有 ...
- C++安全方向openssl(三):3.2 md5算法原理详解以及代码实现
如下图: 由上可知,任意大小的数据经过md5算法是都是4个字节. 涉及到新的安全相关的内容,不再用md5了.通过md5算法的分析我们应该知道我们通过什么方式实现不可逆,又是通过什么方式实现修改一处内容 ...
- 离线强化学习(Offline RL)系列3: (算法篇)策略约束 - BRAC算法原理详解与实现(经验篇)
论文原文:[Yifan Wu, George Tucker, Ofir Nachum: "Behavior Regularized Offline Reinforcement Learnin ...
- DPC密度峰值聚类算法原理详解二
DPC密度峰值聚类算法原理详解二 1.计算数据点两两之间的距离 1.使用 Numpy 模块查找两点之间的欧几里得距离: 2.使用 distance.euclidean() 函数查找两点之间的欧式距离: ...
- CRF(条件随机场)与Viterbi(维特比)算法原理详解
摘自:https://mp.weixin.qq.com/s/GXbFxlExDtjtQe-OPwfokA https://www.cnblogs.com/zhibei/p/9391014.html C ...
- 一致性哈希算法原理详解
一.普通 hash 算法 (取模算法): 在了解一致性哈希算法之前,我们先了解一下缓存中的一个应用场景,了解了这个应用场景之后,再来理解一致性哈希算法,就容易多了,也更能体现出一致性哈希算法的优点,那 ...
- DES加解密算法原理详解与实现
[DES密码编写] 1. Equipment (1) operating system version :WIN 10 (2) CPU instruction set: x 64 (3) softwa ...
- CORDIC算法原理详解及其Verilog实现
CORDIC算法原理详解及其Verilog实现 本文的verilog代码 链接:https://pan.baidu.com/s/1GGbRjxO5CxoIODQAg1l6Lw 提取码:jo0h *本文 ...
- 机器学习,深度学习基础算法原理详解(图的搜索、交叉验证、PAC框架、VC-维(持续更新))
机器学习,深度学习基础算法原理详解(图的搜索.交叉验证.PAC框架.VC-维.支持向量机.核方法(持续更新)) 机器学习,深度学习基础算法原理详解(数据结构部分(持续更新)) 文章目录 1. 图的搜索 ...
最新文章
- 从面试角度一文学完 Kafka
- Matrix calculus
- 自动调节图像的对比度 和改变图像的大小
- 七招从办公室政治中取胜 发表于 09 May 2008 ? 领导力培养
- 迅为linux下串口,迅为IMX6ULL开发板Linux RS232/485驱动实验(上)
- 15个月纪念,开心!
- c语言分组求和函数,R语言 实现data.frame 分组计数、求和等
- 学python适合什么年龄段的人用_7个现在就该学习Python 的理由【80%的人都不知道】...
- 八月计算机考试试题,职称计算机考试题库和答案
- 名词解释:什么是RSS? [转贴]
- 指纹模式识别算法源码及其测试和应用方法
- .tar.gz和.tar.bz2解压命令
- Android手机开发者模式
- win10下使用pycharm实现基于pyg的cora+citeseer+pubmed数据集的JKNET模型测试
- 主题:程序的扩展性(第二节:如何扩展), 时间:2004-12-10 03:00 PM
- php 批量 挂马,php下批量挂马和批量清马代码
- 【BZOJ3991】【SDOI2015】寻宝游戏
- Qos限速、流量监管、流量整形原理和实验(华为设备)
- android音乐视频播放器,android音乐视频播放器.doc
- python处理grd格式文件_GBDT原理及利用GBDT构造新的特征-Python实现