目录

原理:

思想

代码:

快排代码详解:

执行结果


原理:

先选择一个数作为 基准值 (这里用的是 第一个数),进行一次排序
然后将所有比'基准值小的数'放在基准值的'左边',
将所有比'基准值大的数'放在基准值的'右边',

然后再对两边的,各自'再取一个数作为基准值',然后再次排序递归[自己调自己])

思想

通过一个基准值,把一组数据分成两个部分(一边小,一边大),然后,在对两个部分,分别找一个基准值再次进行排序直至每一个小部分不可再分,所得到的整个数组就成为了有序数组。

代码:

#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语言-快速排序算法-原理-详解(完整代码)相关推荐

  1. TOPSIS(逼近理想解)算法原理详解与代码实现

    写在前面: 个人理解:针对存在多项指标,多个方案的方案评价分析方法,也就是根据已存在的一份数据,判断数据中各个方案的优劣.中心思想是首先确定各项指标的最优理想值(正理想值)和最劣理想值(负理想解),所 ...

  2. 快速排序算法原理详解

    快速排序算法是冒泡排序算法的一种改进,采用"分而治之"的思想,把大的拆分成小的,再把小的拆分成更小的.如:对于一组待排的记录,通过一趟排序后,将原序列分成两部分,其中前一部分的所有 ...

  3. C++安全方向openssl(三):3.2 md5算法原理详解以及代码实现

    如下图: 由上可知,任意大小的数据经过md5算法是都是4个字节. 涉及到新的安全相关的内容,不再用md5了.通过md5算法的分析我们应该知道我们通过什么方式实现不可逆,又是通过什么方式实现修改一处内容 ...

  4. 离线强化学习(Offline RL)系列3: (算法篇)策略约束 - BRAC算法原理详解与实现(经验篇)

    论文原文:[Yifan Wu, George Tucker, Ofir Nachum: "Behavior Regularized Offline Reinforcement Learnin ...

  5. DPC密度峰值聚类算法原理详解二

    DPC密度峰值聚类算法原理详解二 1.计算数据点两两之间的距离 1.使用 Numpy 模块查找两点之间的欧几里得距离: 2.使用 distance.euclidean() 函数查找两点之间的欧式距离: ...

  6. CRF(条件随机场)与Viterbi(维特比)算法原理详解

    摘自:https://mp.weixin.qq.com/s/GXbFxlExDtjtQe-OPwfokA https://www.cnblogs.com/zhibei/p/9391014.html C ...

  7. 一致性哈希算法原理详解

    一.普通 hash 算法 (取模算法): 在了解一致性哈希算法之前,我们先了解一下缓存中的一个应用场景,了解了这个应用场景之后,再来理解一致性哈希算法,就容易多了,也更能体现出一致性哈希算法的优点,那 ...

  8. DES加解密算法原理详解与实现

    [DES密码编写] 1. Equipment (1) operating system version :WIN 10 (2) CPU instruction set: x 64 (3) softwa ...

  9. CORDIC算法原理详解及其Verilog实现

    CORDIC算法原理详解及其Verilog实现 本文的verilog代码 链接:https://pan.baidu.com/s/1GGbRjxO5CxoIODQAg1l6Lw 提取码:jo0h *本文 ...

  10. 机器学习,深度学习基础算法原理详解(图的搜索、交叉验证、PAC框架、VC-维(持续更新))

    机器学习,深度学习基础算法原理详解(图的搜索.交叉验证.PAC框架.VC-维.支持向量机.核方法(持续更新)) 机器学习,深度学习基础算法原理详解(数据结构部分(持续更新)) 文章目录 1. 图的搜索 ...

最新文章

  1. 从面试角度一文学完 Kafka
  2. Matrix calculus
  3. 自动调节图像的对比度 和改变图像的大小
  4. 七招从办公室政治中取胜 发表于 09 May 2008 ? 领导力培养
  5. 迅为linux下串口,迅为IMX6ULL开发板Linux RS232/485驱动实验(上)
  6. 15个月纪念,开心!
  7. c语言分组求和函数,R语言 实现data.frame 分组计数、求和等
  8. 学python适合什么年龄段的人用_7个现在就该学习Python 的理由【80%的人都不知道】...
  9. 八月计算机考试试题,职称计算机考试题库和答案
  10. 名词解释:什么是RSS? [转贴]
  11. 指纹模式识别算法源码及其测试和应用方法
  12. .tar.gz和.tar.bz2解压命令
  13. Android手机开发者模式
  14. win10下使用pycharm实现基于pyg的cora+citeseer+pubmed数据集的JKNET模型测试
  15. 主题:程序的扩展性(第二节:如何扩展), 时间:2004-12-10 03:00 PM
  16. php 批量 挂马,php下批量挂马和批量清马代码
  17. 【BZOJ3991】【SDOI2015】寻宝游戏
  18. Qos限速、流量监管、流量整形原理和实验(华为设备)
  19. android音乐视频播放器,android音乐视频播放器.doc
  20. python处理grd格式文件_GBDT原理及利用GBDT构造新的特征-Python实现

热门文章

  1. 【模电笔记】6.集成运算放大器应用电路
  2. js高级开发:气泡坦克(js对象,属性)
  3. 软件工程c语言课程设计的作用,C语言课程设计指导书2016版HNUST
  4. 屏幕录像专家使用手册
  5. C语言之父丹尼斯·里奇:乔布斯脚下的巨人肩膀
  6. 《机器人动力学与控制》第九章——动力学 9.4 欧拉-拉格朗日方程法应用举例(下)
  7. 我遇到了Rational Rose
  8. sniffer安装问题
  9. bootstrap个人简历毕业作品模板
  10. 营销理论模型:4P、STP理论、SWOT图解