java快速排序直观演示代码,java快速排序算法怎么写_java快速排序算法代码分享...

java快速排序算法怎么写?java快速排序算法是挺难写的,由于快速排列对程序员的逻辑思维有很高的请求,下面为大家带来了java快速排序算法代码分享,来看看详细的思路吧!

Tips 1:对于“算法”及“排序”的基本常识,在此前“抉择排序法”中已具体讲授,可点击文后的相干文章链接查看,在此不再赘述。

Tips 2:假如无特别阐明,本文的快捷排序是从小到大的排序。

倏地排序法的原理

快速排序是一种划分交流排序,它采取分治的策略,通常称其为分治法。

分治法

根本思维:将原问题分解为若干个范围更小但构造与原问题类似的子问题。递归地解决这些子问题,然后将这些子问题的结果组合成原问题的结果。

基础原理

从序列中任选一个数作为“基准”;

所有小于“基准”的数,都挪到“基准”的左边;所有大于等于“基准”的数,都挪到“基准”的右边;

在这次挪动停止之后,该“基准”就处于两个序列的中间位置,不再参加后续的排序;

针对“基准”左边跟右边的两个子序列,一直反复上述步骤,直到所有子序列只剩下一个数为止。

原理图解

现有一个序列为 [8, 4, 7, 2, 0, 3, 1],如下演示快速排序法如何对其进行排序。

实现快速排序的步骤分解

取舍“基准”,并将其从原始数组分别

先获取基准的索引值,再应用splice数组方式掏出基准值。

Tips:该实例中, 基准的索引值 = parseInt(序列长度 / 2)

Tips:splice方法会改变原始数组。例如,arr = [1, 2, 3]; 基准索引值为1,基准值为2,原始数组变为arr = [1, 3];

遍历序列,拆分序列

与“基准”比较大小,并拆分为两个子序列

小于“基准”的数存储于leftArr数组当中,大于等于“基准”的数存储于rightArr数组当中

Tips:当然,也能够将 小于等于“基准”的数存于leftArr,大于“基准”的数存于rightArr

因为要遍历序列,将每一个数与“基准”进行大小比拟,所以,需要借助for语句来实现

递归调用,遍历子序列并组合子序列的成果

定义一个函数,形参用于接受数组

function quickSort(arr) { };

实现递归调用遍历子序列,用concat数组办法组合子序列的结果

断定子序列的长度

递归调用的进程中,子序列的长度即是1时,则结束递归调用,返回当前数组。

快速排序法完全代码

疾速排序法的效力

时间复杂度

最坏情况:每一次选取的“基准”都是序列中最小的数/最大的数,这种情况与冒泡排序法相似(每一次只能断定一个数[基准数]的顺序),时间复杂度为O(n^2)

最好情形:每一次选取的“基准”都是序列中最旁边的一个数(是中位数,而不是地位上的中间),那么每次都把当前序列划分成了长度相等的两个子序列。这时候,第一次就有n/2、n/2两个子序列,第二次就有n/4、n/4、n/4、n/4四个子序列,依此类推,n个数一共须要logn次才干排序实现(2^x=n,x=logn),而后每次都是n的庞杂度,时光复杂度为O(n logn)

空间复杂度

最坏情况:需要进行n?1 次递归调用,其空间复杂度为 O(n)

最好情况:需要logn次递归调用,其空间复杂度为O(logn)

算法的稳定性

快速排序是一种不稳定排序算法

例如:现有序列为[1, 0, 1, 3],“基准”数字挑选为第二个1

在第一轮比较之后,变成了[0, 1, 1, 3],左序列为[0],右序列为[1, 3](右序列的1是此前的第一个1)

不难发明,原序列的两个1的先后顺序被损坏了,转变了先后次序,天然就是“不稳固”的排序算法了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值