算法系列-快速排序
今天重温一下快速排序,快速排序主要是通过从右向左和从左向右扫描,当左边的扫描标记到比基准值大的停下,右边的扫描标记标记到比基准值小的停下,然后交换左右标记处的值,每一轮当左右扫描标记相遇则本轮结束,每一轮扫描主要是把基准值放到正确的位置上,把比基准值小的放到基准值的左边,比基准值大的放到右边。
直接上代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | public void quickSort( int [] data, int left, int right) { if (left >right) { //直接退出 return ; } int baseValue=data[left]; int start=left; int end=right; int tmp= 0 ; while (start!=end) { //从右向左扫描 while (data[end]>=baseValue&&end>start) { end--; } //从左向右扫描 while (data[start]<=baseValue&&end>start) { start++; } //交换两个值得位置 if (end>start) { tmp=data[end]; data[end]=data[start]; data[start]=tmp; } } //一轮遍历完成后,交换基准值 data[left]=data[start]; data[start]=baseValue; //递归继续下一轮遍历 quickSort(data,left,start- 1 ); quickSort(data,start+ 1 ,right); } |
上面的代码主要通过递归来实现该排序,如果我们把这两段代码交换一下位置,效果是否是一样的呢?
这段代码是我不经意间写反的,答案是肯定的,这两段代码的顺序不能交换,交换后就无法排出正确的顺序。为什么会有这样的差异呢,其实很简单,如果先从左向右扫描,就无法保证基准值的左边是小于它的,右边是大于它的,如下图遍历过程就未找到正确的基准值,这违背了算法定义,所以必须先从右向左扫描。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?