严版快速排序Partion方法
来源:互联网 发布:淘宝网婴儿用品 编辑:程序博客网 时间:2024/05/23 14:27
严版快速排序Partion方法
@(算法学习)
int Partion(int A[], int low, int high){ int pivot = A[low]; // 第一个元素设为pivot值 while(low < high) { while(low < high && A[high] >= pivot) { --high; // 从右往左找到第一个比pivot小的停下来 } A[low] = A[high]; //把比pivot小的数移到pivot在的位置,因为pivot已经存储了,所以可以直接覆盖 // 此时high指向的位置空出来了,从左往右寻找比pivot大的值,欢迎入住high的老家 while(low < high && A[low] <= pivot) { ++low;//直到low指向第一个比pivot大的值停下来 } A[high] = A[low]; // low指向的值要搬到high处,则low处的位置空了,且其左边都是不大于pivot的,右边 } // 上面的大循环是low == high才结束,因此不是从右到左一次再从左到右一次就结束,而是直到pivot真的比左边都大比右边都小时结束 A[low] = pivot; //此时 return low;}
举个例子:
28, 16, 32, 12, 60, 2, 5, 72
首先以pivot = 28, 从右往左找比第一个28小的,找到5,将5覆盖到28处:
5, 16, 32, 12, 60, 2,
划线的5是可以被覆盖的。
再从左往右找第一个比28大的,找到32,将其填到划线的5处。
5, 16,
注意此时high指向的是粗体的32,low指向的是划线的32.
这时候low仍然小于high,因此继续循环。
从右往左找比28小的,找到2,填充到划线的32处。
5, 16, 2, 12, 60,
high指向的是划线的2,low指向的是粗体的2.
low < high仍然成立。
从左往右找比28大的,找到60,覆盖划线的2.
5, 16, 2, 12,
此时可以看到low就在high左边了。下一轮是从右往左,找比28小的,–high一次,与low相等,于是外层循环条件被打破,low与high都指向划线的60.
这个位置是用来存pivot的。把pivot放进来:
5, 16, 2, 12, 28, 60, 32, 72
这样才能说一次Partion结束,此时28就是最终的位置。左边都比28小,右边都比28大。
注意:快排是不稳定的。比如:2,1,1,交换一次变为1, 1, 2,1的相对位置改变,所以不稳定。
1 0
- 严版快速排序Partion方法
- Partion方法的应用
- 随机版的快速排序分析方法
- 排序方法之快速排序
- 快速排序方法
- php快速排序方法
- 快速排序方法
- 快速排序方法
- 快速排序方法
- 快速排序非递归方法
- 快速排序的一种方法
- 快速排序的各种方法
- 快速排序的改进方法
- 快速排序 两种方法
- 快速排序的改进方法
- 快速排序的改进方法
- 快速排序的记忆方法
- js原生排序和快速排序方法
- spring <context:component-scan>使用说明
- IO流的种类
- Java NIO(1)
- C++强制类型转换
- JavaSE,JavaEE,JavaME的区别
- 严版快速排序Partion方法
- 一个快排
- BigDecimal不整除的一个异常java.lang.ArithmeticException
- 城堡(统计最短路数问题)
- 循环链表—约瑟夫环问题
- Django信号
- 回顾2016年初时候的愿景
- 如何在文章页以外调用wordpress文章的第一条,最好是系统函数 而不是数据库调用
- JDR与JRE的区别