快速排序——栈和数组——两种思路(递归+挖坑填埋法)
来源:互联网 发布:极简生活后的变化知乎 编辑:程序博客网 时间:2024/05/29 03:25
原理:选取一个数,使得这个数的左边比这个数小,右边的数比这个数大。
接下来的问题是如果实现这个过程。
第一种用栈做
用栈做就太简单了。
直接锁定1。
从3开始往后找。
找到小的数,直接插入到1的前面。
再对每一部分进行递归。
这里是找到了 0 0,新序列是 0 0 1 3 6 2 8 4 8
接下来就是 0 0里找
再是3 6 2 8 4 8里找。
。。。
这里用List模拟的栈
// 136284008List实现太轻松了void calculate(List<Integer> list, int startIndex, int endIndex) {// origin index 0 size-1 if (startIndex == endIndex || startIndex + 1 == endIndex) { return; } int firstNum = list.get(startIndex); int index = startIndex; for (int i = startIndex + 1; i <= endIndex; i++) { int num = list.get(i); if (num < firstNum) { list.add(startIndex, num); list.remove(i + 1); index++; } } calculate(list, startIndex, index - 1); calculate(list, index + 1, endIndex);}
第二种用数组做,略微麻烦一点。
没有List那么方便,需要挖坑。
我们依然选取1作为参照数。
用X保存这个1。1就仿佛成了一个被挖出来的坑,因为他的数已经被保存了,所以这个位置上可以任意赋值了。
之后从最后一位开始找比1小的数。8不符合。0是符合的。
所以这个0就填到刚刚第一位的坑里,而0的那个位置有多出来一个坑。
接下来就是要从左边开始找大的数,3直接就符合了。放到刚刚0的坑里。而3又多出来一个坑。
接下来又是从右边找。。。直到左右相遇。
//数组实现void calculate(int a[], int startIndex, int endIndex) { if (startIndex == endIndex || startIndex + 1 == endIndex || startIndex > endIndex) { return; } int x = a[startIndex]; int ken = startIndex; int s = startIndex; int e = endIndex; startIndex ++; boolean flag = true; while (startIndex <= endIndex) { if (flag) { if (x > a[endIndex]) { a[ken] = a[endIndex]; ken = endIndex; flag = false; } endIndex --;//0 } else { if (x < a[startIndex]) { a[ken] = a[startIndex]; ken = startIndex; flag = true; } startIndex ++; } } a[ken] = x; calculate(a, s, ken - 1); calculate(a, ken + 1, e);}
阅读全文
0 0
- 快速排序——栈和数组——两种思路(递归+挖坑填埋法)
- 排序——快速排序挖坑法的变形
- 【数据结构】快速(QuickSort)排序之——挖坑法
- 数组——快速排序法(递归)
- 快速排序的两种实现思路和非递归实现--C++实现
- 实现冒泡排序的和快速排序的递归和非递归版——题集(十七)
- 数组小和 归并排序思路 递归、非递归求解
- 快速排序经典算法(分治法,挖坑法,前后指针法,非递归)
- 递归与分治——快速排序
- 分治与递归——快速排序
- 挖坑型快速排序
- 数组排序——快速排序
- java快速排序算法(数组和list两种方式)
- 详谈排序算法之交换类排序(两种方法实现快速排序【思路一致】)
- 算法系列—快速排序及其优化(递归)
- 快速排序算法——两种写法
- 递归算法——归并排序,快速排序,二分查找
- 快速排序(递归和非递归)
- 12.3(2)
- PAT 1067. 试密码(20)
- 使用=React.PropTypes进行类型检测
- git报错:data stream error (incorrect data check)和 The remote end hung up unexpectedly
- java注解
- 快速排序——栈和数组——两种思路(递归+挖坑填埋法)
- Django初认识
- make与makefile的编写
- 磁盘IO原理
- python爬虫爬取豆瓣top250电影影评
- spring boot笔记
- js、匿名函数、闭包、回调函数
- Safe-Home页面(1)
- QML控件学习——之仪表盘控件Dial和DialStyle(自定义仪表盘)