快速排序法学习笔记

#include<stdio.h>void swap(int *a,int *b)
{int t;t=*a;*a=*b;*b=t;
}void quickSort(int *nums,int begin,int end)
{if(begin>end)return;int tmp=nums[begin];int i,j;i=begin;j=end;while(i!=j){  while(nums[j]<=tmp&&i<j)j--;while(nums[i]>=tmp&&i<j)i++;if(j>i)swap(&nums[i],&nums[j]); }swap(&nums[begin],&nums[i]);quickSort(nums,begin,i-1);quickSort(nums,i+1,end);}int main()
{int nums[10]={4,6,1,5,3,0,8,2,7,9};quickSort(nums,0,9);int i;for(i=0;i<10;i++){printf("%d ",nums[i]); }printf("\n");return 0; }

快速排序法是冒泡排序法的升级版本。
冒泡排序法是从数组的一段开始遍历,比较相邻两个数的大小。
而快速排序法是,选择任意一个数为参照,这里记为tmp,从数组的两端开始比较,两边同时开始遍历,通过将比tmp大的数放到右边,将比tmp小的数放到左边,结合递归的思想 ,不断引用自身函数实现全体数组的排序。

写代码时需要注意:

让左哨兵巡逻时,是让左哨兵先巡逻,还是让右哨兵先巡?


while(i!=j)
{  while(nums[j]<=tmp&&i<j)j--;while(nums[i]>=tmp&&i<j)i++;if(j>i)swap(&nums[i],&nums[j]);
}

假设参考值选择为数组的第一个数,即nums[0]
(哈哈一般都是这么选的)

参数i从左边开始遍历,找到比参考值大的数停下
参数j从右边开始遍历,找到比参考值小的数停下

就好像是两个哨兵,一个从国界左边开始巡逻,一个从国界右边开始巡逻,当遇到不符合要求的对象时停下(即左哨兵发现对象比参考数tmp大,右哨兵发现对象没比参考数tmp小)

这时,只需要将左右哨兵所在的位置的对象(数组值num[i],num[j])进行交换,就能满足,左边的数不大于参考数tmp,右边的数不小于参考数tmp
(一般都是这样ha,也可以相反)

接着继续巡逻,直到两个哨兵相遇,该位置记为locate1,就把整个国界走过一遍(数组遍历,与参考值tmp比较了一遍),结果是左边的所有数都不大于参考值tmp,右边的所有数都不小于参考值tmp,*除了数组的第一个数nums[0],因为他被选做参考数tmp


while(i!=j)
{  while(nums[j]<=tmp&&i<j)j--;while(nums[i]>=tmp&&i<j)i++;if(j>i)swap(&nums[i],&nums[j]);
}

这里讨论一下选做参考数的数组的第一个数nums[0]应该怎么处理
首先,处理目标:让nums[0]的数值tmp,调换到中间,使满足左边的数都不大于tmp,右边的数都不小于tmp
其次,处理对象:第一个数nums[0],哨兵相遇的位置上的数nums[locate1]

对于nums[locate1],c语言是面向过程的程序设计语言,代码是依次执行,必然存在左哨兵先巡逻至停下,或者右哨兵先巡逻至停下的情况,而这两种情况对应的nums[locate1]与tmp的大小关系也不相同

第一种情况 左边哨兵先巡逻,先停下
还记得左边哨兵的终止条件么?
因为对象表示的数大于参考值时,左哨兵停下,
所以左哨兵先巡逻先停下的结果是,左右哨兵最后相遇时,

对象nums[locate1]是比参考值大的数
这时如果将 该对象的位置上的值nums[locate1]与参考值nums[0](数组第一个数的值)进行交换,结果是,该对象的位置,locate1右边的数都不小于参考数(满足要求了),该位置locate1上的数nums[locate1]等于参考数(也满足要求了),
然而locate1左边,第一个数nums[0]大于参考数tmp

如果想实现 让参考数左边的数都不大于他,参考数的右边的数都不小于他,必须进一步处理,将第一个数换成不大于参考数的数

第二种情况,右边哨兵先巡逻,先停下
同理,这种情况,两哨兵最终相遇时,nums[locate1]<=tmp
这时只需要将 nums[0] (之前设为参考值tmp)与nums[locate1]交换即可满足,将参考值tmp调换到了中间位置,而且参考值tmp左边都不大于参考值tmp,右边都不小于参考值tmp
显然这种思路要简便许多
而本文最初的代码就采用了这种思路


while(i!=j)
{  while(nums[j]<=tmp&&i<j)j--;while(nums[i]>=tmp&&i<j)i++;if(j>i)swap(&nums[i],&nums[j]);
}
---

这是我在学习快速排序法中的一些心得体会,
总结了在学习中遇到的让左哨兵先巡逻还是右哨兵先巡逻的问题,另外我在敲代码时还犯了将哨兵巡逻 while语句中的临界条件nums[j]<=tmp错写成<的错误
总结经验,继续努力喽~

探索初级算法学习笔记-快速排序法相关推荐

  1. C++初级算法-学习笔记

    目录 算法的基本概念 什么是算法 什么是数据结构 模拟与高精度 模拟算法 高精度运算 算法评价与算法复杂度 算法"评价员" 如何评价算法 暴力枚举 枚举 子集枚举 排列枚举 排序 ...

  2. 网络流算法学习笔记——最大流问题基本概念和Ford-Fulkerson方法(标号法C++实现)

    屈婉玲<算法设计与分析>第2版第7章网络流算法学习笔记. 基本概念 最大流问题,相当于有从s到t的供水系统,每段路径都有限定流量,除了s.t两地外,每个中间点都不能滞留,从s流入多少,就从 ...

  3. 《数据结构、算法与应用 —— C++语言描述》学习笔记 — 回溯法

    <数据结构.算法与应用 -- C++语言描述>学习笔记 - 回溯法 一.算法思想 二.货箱装载 1.问题描述 2.回溯算法 3.实现 4.测试代码 一.算法思想 回溯法是搜索问题解的一种系 ...

  4. Python最优化算法学习笔记(Gurobi)

    微信公众号:数学建模与人工智能 github地址:https://github.com/QInzhengk/Math-Model-and-Machine-Learning Python最优化算法学习笔 ...

  5. Python预测 数据分析与算法 学习笔记(特征工程、时间序列)

    微信公众号:数学建模与人工智能 GitHub - QInzhengk/Math-Model-and-Machine-Learning 第3章 探索规律 3.1 相关分析 相关关系是一种与函数关系相区别 ...

  6. 用matlab代码进行数据探索、数据清洗学习笔记

    目录 1.说明 2.作文目的 3.数据质量分析3个判别方法 3-1.异常值判别 3-1-1.箱型图法 3-1-2.3σ准(原)则(拉依达准则) 3-2.缺失值判别 3-3.不一致的值判别 4.数据清洗 ...

  7. 机器学习knn算法学习笔记使用sklearn库 ,莺尾花实例

    ** 机器学习knn算法学习笔记使用sklearn库 ,莺尾花实例. 具体knn算法是怎样的我这里就不再详细论述.在这里我注意总结我使用knn算法进行一个分类的分析 ** 分析过程 1.前期准备 引入 ...

  8. 数学建模算法学习笔记

    数学建模算法学习笔记 作为建模Man学习数学建模时做的笔记 参考文献: <数学建模姜启源第四版> 网上搜罗来的各种资料,侵删 1.线性预测 levinson durbin算法,自相关什么的 ...

  9. 数据结构与算法学习笔记4:递归+分治法

    数据结构与算法学习笔记4 递归 斐波那契数列 青蛙跳台阶问题 链表倒序打印 分治法 二分查找/折半查找 Binary Search 题目1:快速幂 题目2:如何判断一个数是否为2的次幂 递归 指在函数 ...

最新文章

  1. python手机版idle-如何在Ubuntu上安装Python IDE IDLE
  2. 创建springboot出现error:connection timed out创建springboot报错显示连接超时解决方案
  3. 通过Wireshark抓包分析谈谈DNS域名解析的那些事儿
  4. Linux 没有主清单属性,maven编译正常,运行报错:中没有主清单属性
  5. 宝塔面板搭建autoPicCdn:一款基于jsdelivr-Github的免费CDN图床
  6. 二 vue环境搭建
  7. JSK-396 平均值【入门】
  8. Axure|【民宿】民宿APP原型
  9. 中国象棋人工智能实现
  10. ESP分区和MSR分区下怎么重做GHOST系统
  11. 内置单片机的433无线模块高速连传典型运用
  12. 2020-21《全球软件质量报告》解读
  13. 在不同位置(客户端的终端设备,服务端,项目代码中)判断设备类型(PC、手机、微信等)
  14. 苹果状态栏HTML,有关HTML5页面在iPhoneX适配问题
  15. DELL笔记本自带键盘启动与关闭方式
  16. 64位开源处理器Rocket的源代码简单介绍
  17. api有哪些 javasocket_Java Socket编程以及与Linux Socket API关系
  18. Windows 与 Linux之间进行文件传输,文件传输工具Cuteftp的使用方法。
  19. 机器学习-001-SVM线性可分-2020-4-28
  20. vue+element实现滚动公告栏效果

热门文章

  1. numpy 创建加一行_NumPy数据处理的可视化
  2. java代码分类_08 java代码块的概述和分类
  3. [CODEVS 1285] 宠物收养所
  4. hdu5444(2015长春网络赛H题)
  5. CSP-S2019游记
  6. java接口和实例_java – 接口和实例化
  7. python表示数字6_【第六节】Python数字(Number)
  8. overleaf服务端_部署私有在线Latex编辑器:Overleaf/sharelatex,写毕设神器
  9. Charles学习(四)之使用Map local代理本地静态资源以及配置移动端代理在真机上调试iOS和Android客户端...
  10. oracle学习笔记5:pl/sql流程控制语句