3-5 回顾,快速二分法的疑点解惑:为啥先右j移动?因为设定a[left]为基准点

快速二分法的疑点解惑:为啥先右j移动?因为设定a[left]为基准数

思路:(查看了网上的2篇文章,关键点就是谁为基准数,我自己又尝试了不同排序,不同基准数left,right。得出??的结论)

步骤:

1. 在序列中设a[left]为基准数。最左边设i,最右边设j(目标是从大到小排列)

2. 先从右往左找大于基准数的数,再从左往右找小于基准数的数,找到后两数交换位置

3. 然后重复2和3步骤。直到i和j最终相遇,结束本次循环。

4. 把基准数和最终相遇的数交换,结束。此步骤定位了一个数。

5. 原基准数左边和右边的序列再分别重复1-4的步骤。继续定位新的基准数。直到全部数字定位结束。

第2步,先右移动,是因为基准点设为a[left]。如果先左边i移动的话得到的a[i]必然比a[left]小。

在第4步交换a[i]和a[left]的时候导致了基准点a[left]右边竟然有比它小的数字。不符合每次循环定位1个基准点的原则,从大到小排序就失败了。(当然如果是从小往大排序也一样,会导致类似的问题出现。)

所以如果基准点定位到最左边的话,j就要先移动。当然基准点定位到最右边的话,i就先移动了。

def quicksort(a,left,right)

if left > right                # 设定何时停止该方法的调用。

return

end

temp = a[left]              #设定最左边的为基准数

i = left

j= right

while i != j                   # i和j从两边向中间靠拢,直到i和j重合,结束本轮循环。

#  根据是升序还是降序来选择 比较运算符号。

while a[j] <= temp && i < j  #根据基准点是a[left],要先从右往左找。

j -= 1

end

while a[i] >= temp && i < j  #再从左向右找,这里找小于基准数的数。

i += 1

end

if i < j                    #当i 和 j 没有相遇的时候,交换数据

t = a[i]

a[i] = a[j]

a[j] = t

end

end

a[left] = a[i]              #将基准数归位。

a[i] = temp

print a.to_s + "\n"      #打印每次交换的结果

quicksort(a,left,i-1)       # 在quciksort的方法中,再次调用本方法,形成递归的过程。这个是处理i左边。                                       # 直到穷尽,即当left>right时停止调用该方法。

quicksort(a,i+1,right)    # 这个处理i右边

end

a =  [7, 68, 42, 46, 9, 91, 77, 46, 86, 1]

quicksort(a,0,9)

# 0和9 代表数组最左边和最右边的key

print a

结果:

[86, 68, 42, 46, 9, 91, 77, 46, 7, 1]

[91, 86, 42, 46, 9, 68, 77, 46, 7, 1]

[91, 86, 42, 46, 9, 68, 77, 46, 7, 1]

[91, 86, 77, 46, 46, 68, 42, 9, 7, 1]

[91, 86, 77, 46, 46, 68, 42, 9, 7, 1]

[91, 86, 77, 68, 46, 46, 42, 9, 7, 1]

[91, 86, 77, 68, 46, 46, 42, 9, 7, 1]

[91, 86, 77, 68, 46, 46, 42, 9, 7, 1]

[91, 86, 77, 68, 46, 46, 42, 9, 7, 1]

[91, 86, 77, 68, 46, 46, 42, 9, 7, 1]

[91, 86, 77, 68, 46, 46, 42, 9, 7, 1] #最终结果

原文地址:https://www.cnblogs.com/chentianwei/p/8513576.html

时间: 2024-10-13 13:53:35

3-5 回顾,快速二分法的疑点解惑:为啥先右j移动?因为设定a[left]为基准点的相关文章

HBase之disable+drop删除表疑点解惑

HBase中删除一张表 先disable 'tableName' 再drop 'tableName'来删除表 问:如果region非常多(但没有访问量了),对线上会有什么影响吗? 答:disable只是改了一下ZK里面table的状态.drop也不是现场就把hfile删掉了,只是迁移到.archive目录下,然后有一个过期时间,定期清理的.这个过程需要做flush.所以执行drop命令,region数量对hbase的影响基本为0.主要是hdfs要move一下文件. 问:drop后,hfile那些

【开源框架】Android之史上最全最简单最有用的第三方开源库收集整理,有助于快速开发,欢迎各位...

[转]http://www.tuicool.com/articles/jyA3MrU Android开源库 自己一直很喜欢Android开发,就如博客签名一样, 我是程序猿,我为自己代言 . 在摸索过程中,GitHub上搜集了很多很棒的Android第三方库,推荐给在苦苦寻找的开发者,而且我会 不定期的更新 这篇文章. Android下的优秀开发库数不胜数,在本文中,我列举的多是开发流程中最常用的一些.如果你还想了解更多的Android开源库,可以关注我的博客,每一个库都是我认真查看或者编译运行

我的2017OKR - 年中回顾

自从订阅了吴军老师的<硅谷来信>之后,对其中一篇介绍Google的目标管理方法OKR的文章记忆犹新.想到自己喜欢在每年年初的时候给自己定制一些规划,于是乎了解了一下OKR并重构了一下我的2017年计划,并借此机会进行一个年中(不是终)回顾,希望能有越来越多人使用OKR给自己设定目标规划(目前自己正在向自己创建的有书共读微信群里的书友推荐使用),并努力去完成计划,当一年结束时看看自己完成的情况,会有不自觉地自豪感(前提是你得尽力去完成60%以上的情况下). 一.也谈OKR是个什么鬼 1.1 什么

Fast Walsh-Hadamard Transform——快速沃尔什变换

模板题: 给定$n = 2^k$和两个序列$A_{0..n-1}$, $B_{0..n-1}$,求 $$C_i = \sum_{j \oplus k = i} A_j B_k$$ 其中$\oplus$是某一满足交换律的位运算,要求复杂度$O(nlogn)$. 快速沃尔什变换: 这是什么东西?有用吗?请参阅SDOI2017r2d1-cut. 看到这个大家是不是立刻想到了快速傅里叶变换? $$C_i = \sum_{j + k = i} A_j B_k$$ 我们来想想离散傅里叶变换的本质. $$\b

快速创建数据大绝招

作为程序员,创建数据库,输入数据的时候,都会有个量的问题,少了好说,多了呢,上千上万条怎么办?一个个输入的话那不是要死人? 还好,咱有妙招,不多说了,直接进入正题:如何把word文件数据快速生成数据! 准备条件:word.Excel (我用的是wps,Excel使用上有点区别,一会介绍): 还有 EditPlus 说白了也就是EditPlus绝妙用法: 先看原来word文件数据是这样的 选中,复制出来=> 粘贴到EditPlus中,先预备好创建代码=> 同样的代码快速复制,请狠狠的按Ctrl+

vim快速入门

vim模式介绍 vim的3种模式介绍 vim存在三种工作模式,分别是命令模式,插入模式和底行模式. 命令模式:输入vim命令后启动vim默认进入命令模式,此时所有键部是功能键. 插入模式:命令模式下按“i”就可以进入插入模式,这时就像记事本一样编辑文本了. 底行模式:在命令模式下输入“:”进入底行模式,可以用以保存文件.退出vim以及设置环境执行编译命令等. 3种模式的切换 vim启动进入命令模式 处于插入模式或底行模式时只需按“Esc”退出键即可进入命令模式. 命令模式中按“i”(插入)或“a

hdu5564--Clarke and digits(数位dp+矩阵快速幂)

// hdu 5564 // 考虑dp,令d(i,j,k)表示长度为i第i位为j余数为k的方案数 // 则d(1,j,j%7) = 1, 0<j<10 d(i+1,x,(k*10+x)%7)+=d(i,j,k) // 发现转移相同,所以我们用矩阵快速幂来计算即可. // dp[k][j] 首位为j 余数为k的方案数 // 把dp写成一维 dp[k*10+j] #include <bits/stdc++.h> using namespace std; typedef long lon

ACM最大值最小化&amp;&amp;二分法

Description Before the invention of book-printing, it was very hard to make a copy of a book. All the contents had to be re-written by hand by so calledscribers. The scriber had been given a book and after several months he finished its copy. One of

开源框架】Android之史上最全最简单最有用的第三方开源库收集整理,有助于快速开发

[原][开源框架]Android之史上最全最简单最有用的第三方开源库收集整理,有助于快速开发,欢迎各位... 时间 2015-01-05 10:08:18 我是程序猿,我为自己代言 原文  http://blog.csdn.net/caoyouxing/article/details/42418591 主题 开源 安卓开发 http://www.tuicool.com/articles/jyA3MrU Android开源库 自己一直很喜欢Android开发,就如博客签名一样, 我是程序猿,我为自