文章字数:916,阅读全文大约需要3分钟
快速排序的思想就是把第一个数作为基数,比基数小的放到前面,比基数大或等于的放到基数后面。然后再对基数以前和基数以后的部分分别进行前面的操作,直到基数前面和基数后面都只有一个数时(左侧游标和右侧游标相遇)
时间复杂度O(N*logN)
具体方案
调用:
- 写一个用于整理区域的方法
- 递归调用,整理所有的部分(整理当前,的到基数位置,递归整理基数之前的区域,递归整理基数之后的区域)
整理方法:
- 选第一位为基数
- 右游标从前找比基数小的数,放到左游标处(左右游标的位置上都没有值,因为一旦选中某个元素,就意味着这个元素不符合要求,需要放到另一边)
- 左游标向后找比基数大的数,放到右游标的位置。
- 循环2,3操作,知道左右游标相遇,这个位置就是基数应该放在的地方
- 返回基数的位置,方便上面的递归调用时判断基数前后区域
代码
1 | /** |
#输出结果
1 | 0,0,1,1,2,2,2,2,2,2,3,4,4,4,5,6,7,8,14,21,31,34,35,35,55,56,60,68,69,84,95,95,97,98,123,349,354,455,475,484,546,568,582,654,834,3458,5235,8492 |
基于栈的快速排序
上面的使用的是递归,递归如果深度过深可能会造成jvm
栈空间不足。所以修改了一下调用的方法,改为使用先进后出的数据结构stack
,和递归效果一样,但是每次的函数执行完就退出,不会像递归那样不关闭
1 | import java.util.Stack; |
简易版
1 | public void sort(int[] nums, int lIndex, int rIndex) { |