快排思想
2018-02-25 19:29
54 查看
对于数组A[p...r]进行快排:
主要思想:将数组A[p...r]划分为A[p...q-1]和A[q+1...r],使得左区间的每一个元素小于A[q],右区间每一个元素大于A[q]。实现方法:(伪代码)
QUICKSORT(A,p,r)
1 if p<r
2 q=PARTITION(A,p,r) //寻找划分中点
3 QUICKSORT(A,p,q-1)
4 QUICKSORT(A,q+1,r)
其中PARTITION函数极为关键
PARTITION(A,q,r)
1 x=A[r] //假设要置于中间位置的数(即排序后的A[p])是数组最后一个
2 i=p-1
3 for j=p to r-1 //始终保证A[p..i]中所有元素是小于x的
4 if A[j]<=x
5 i=i+1
6 exchange A[i] with A[j]
7 exchange A[i+1] with A[r]
8 return i+1
但是每次选择最后一个数作为划分中点会导致在有些情况下(如数组本来就有序)复杂度极高,所以,这里采取另一种分划方式
RANDOMIZED-PARTITION(A,p,r)
1 i=RANDOM(p,r)
2 exchange A[r] with A[i]
3 return PARTITION(A,p,r)
ps:
这种划分方式也提供了一种快速找出数组A[p...r]中第i小值的一种方法
RANDOMIZED-SELECT(A,p,r,i)
1 if p==r
2 return A[p]
3 q=RANDOMIZED-PARTITION(A,p,r)
4 k=q-p+1
5 if i==k
6 return A[q]
7 else if i<k
8 return RANDOMIZED-SELECT(A,p,q-1,i)
9 else
10 return RANDOMIZED-SELECT(A,q+1,r,i-k)
相关文章推荐
- 遇见未知的自己(四)-冲破思想的屏障
- [Java编程思想-学习笔记]第2章 一切都是对象
- 线程池的应用(缓存的处理思想)
- HNUST 1522 爱心苹果 (三分思想)
- MVC框架分层的基本思想
- 【Java编程思想】(4)多态
- 第12周上机实践项目4 - 利用遍历思想求解图问题(1-4)
- TopK问题快排思想
- 算法洗脑系列(8篇)——第五篇 分治思想
- 回溯算法思想
- 项目4 - 利用遍历思想求解图问题(6-7)
- SeqGAN——对抗思想与增强学习的碰撞
- 【转帖】双调欧几里德旅行商问题求解思想描述
- 通过java递归思想实现以树形方式展现出该目录中的所有子目录和文件
- 第12周项目4利用遍历思想求解图问题1
- Java编程思想-4
- 我的java思想002:为窗口增加窗口监听器类的三种方法
- OC基础语法-03 面向对象思想
- 第十二周 项目4 利用遍历思想求解图问题(输出一些简单回路)
- Bitcask存储系统架构设计思想