快速排序(快排)--->注释超详细
基本思想:
1.先选取一个基准值(一般选取数组第一个元素)。
2.以第一步选取的基准值为标准,然后从最后一个数值开始一步步向前走将数字与基准值进行比较,如果该值大于基准值,这个值的位置将在基准值的右边。
3.如果该值小于基准值,那么这个值放在基准值的左侧。
4.然后经过第一个元素作为基准值的排序,会有两个左右子序列,再分别对这两序列进行上述1,2,3的步骤!
附上运行原理框图:
思路取自于:快速排序算法_哔哩哔哩_bilibili
下面来进行代码的实现:
//该函数是快排的最重要的思想 一般面试的时候 写出这个就够了
int Partition(int* arr, int left, int right) //划分函数,int返回的是基准值的下标
{int tmp = arr[left]; //将基准值提出来到tmp中while (left < right) //这块的left < right就是判断序列中最少有两个值 值得进行排序{while (left<right && arr[right] > tmp) //这块的left < right就是在left和right下标移动的时候 left = right的时候 退出while循环{right--; //右边值大于基准值 right下标-- right指向的值不变}if (left == right) //left和rigth下标相等的时候 直接退出循环{break;}arr[left] = arr[right]; //这块的代码的意思就是真的找到了一个right指向的值比基准值tmp小 这时将ar[rigth]赋值给arr[left]while (left<right && arr[left] <= tmp) //这块给了 "<=" 上面那个while循环给了 ">" { //这样就是为了防止数组arr中有重复值 其实上面给 >= 下面给 < 都可以 就是为了把重复值放到同一边这样一个作用 left++; //左边值小于基准值 left下标++ left指向的值不变}if (left == right){break;}arr[right] = arr[left];}arr[left] = tmp; //这块left于right指向同一个下标return left;
}void Quick(int* arr, int left, int right) //上图中的左下标和右下标
{if (left < right){int index = Partition(arr, left, right);if (left < index - 1) //代表基准值左边子序列中最少有两个值(因为最少要有两个值才有排序的必要){Quick(arr, left, index - 1);}if (index + 1 < right){Quick(arr, index + 1, right); //代表基准值右边子序列中最少有两个值}}
}void QuickSort(int* arr, int len)
{Quick(arr, 0, len - 1);
}
下面附上主函数以及运行结果:
int main()
{int arr[] = {12,35,11,78,94,132,45,68,99};int len = sizeof(arr) / sizeof(arr[0]);QuickSort(arr, len);show(arr, len);return 0;
}
运行结果:
运行平台vs2019 已成功运行 有需要直接Ctrl c + Ctrl v即可
快速排序(快排)--->注释超详细相关推荐
- 归并排序(代码注释超详细)
归并排序: (复制粘贴百度百科没什么意思),简单来说,就是对数组进行分组,然后分组进行排序,排序完最后再整合起来排序! 我看了很多博客,都是写的8个数据呀什么的(2^4,分组方便),我就想着,要是10 ...
- java算法竞赛必备之快读快写(超详细解读)
java算法竞赛必备之快读快写(超详细解读) java写算法的缺点:速度慢.读写复杂.莫名WA(错误答案).TL(超时).CL(超内存)- (那我们还学个啥啊,都转c++写算法不香嘛.)别急别急,有缺 ...
- 用Kotlin语言开发玩安卓,基于基于Material Design+AndroidX + MVP + RxJava + Retrofit等优秀的开源框架开发,注释超详细,方便大家练手
WanAndroid 一位练习时长两年半的安卓练习生根据鸿神提供的WanAndroid开放Api来制作的产品级App,基本实现了所有的功能,使用Kotlin语言,基于Material Design+A ...
- c语言快排过程,快速排序(快排)C语言实现
快速排序 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:经过一趟排序将要排序的数据分割成独立的两部分,其中一部分的全部数据都比另一部分的全部数据都要小,而后再按此方法对这两部 ...
- Git使用小技巧【修改commit注释, 超详细】
通常有些朋友在 git commit -m "xxxx" file.c 后,觉得注释的内容描述不够精准, 想将"xxxx"修改为"yyyy" ...
- TCP协议的服务器与客户端的程序设计(代码注释超详细)
在上篇博客中讲到了三次握手和四次挥手: Linux网络编程--TCP中的三次握手和四次挥手_神厨小福贵!的博客-CSDN博客服务器编程和客户端编程的大致流程如下:三次握手是在客户端中的connect中 ...
- matlab三角形旋转动态,新手向!用WebGL写一个旋转的动态三角形,总共分三步!!(注释超详细!!)...
html部分还是比较简单,引入的matrix.js是矩阵变换的一些方法,网上有很多,大家可以搜一搜(我的线性代数知识已经还给我的高数老师了,最近考虑着手捡起来) demo 下面是demo.js的代码 ...
- 【数据结构与算法】八大排序(中)快速排序 快排居然还能这么优化?快排的非递归该如何写?
- Java菜鸟笔记:Java猜字母游戏完整代码 注释超详细(三次机会,计算总分,可运行)
import java.util.Scanner; import java.util.regex.Pattern; /*** 猜字母游戏,程序随机生成一个五个长度不重复的字母数组,要求用户也输入五个字 ...
最新文章
- [20160303]显示bbed x命令格式.txt
- 计算机网络ip地址的分类
- hdu 4556 Stern-Brocot Tree
- Azkaban启动与激活命令
- 块级元素(导航,图片,层)的水平和垂直居中
- AHK 中的字符串拼接和遍历操作
- wrieshark 指令
- 销售行业转行软件测试,这是我成功的感受...
- Android和ios的区别
- 基于python的智能风扇设计_[Micropython]TPYBoardV102 DIY智能温控小风扇
- mongodb插入查询速度测试
- Excel技能学习小结
- 大学物理 狭义相对论 思维导图总结
- 服务器自定义npc音乐,Custom NPC 自定义NPC模组自定义音乐添加教程
- 【拒绝花里胡哨】运维实用手册shell篇(无废话,全程暴力干货)
- 小傻蛋的妹妹跟随小甲鱼学习Python的第五节005
- 左手Python2 右手Python3,我该选择谁?
- 关于数据库主键和外键,索引
- iphonex 序列号_iPhonex序列号在哪看?iPhonex序列号查看方法介绍[图]
- 2021-08-30剑指 Offer 67. 把字符串转换成整数