快速排序
Posted vector11248
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速排序相关的知识,希望对你有一定的参考价值。
快速排序,给定一个输入的子数组a[p:r],主要分为3步:
- 分解(partition): 以a[p]为基本元素,将数组a分为三段,a[p:q-1],a[q], a[q+1,r] 。其中第一段里的每一个元素都 <= a[q] , 第三段里的每一个元素都
>= a[q]。
2. 递归 (recursion) 。通过递归调用快排算法,分别对a[p:q-1] , a[q+1,r] 进行排序。
3.合并(merge): 由于对a[p:q-1] 和 a[q+1,r]进行排序是就地进行的。所以,在这两段都排好序之后,不需要执行任何操作,数组a 就已经排好序了。
基于以上的思想,快排的伪代码如下:
void quickSort(int[] a,int p,int r){ if(p<r){ q = partition(a,p,r); quickSort(a,p,q-1); quickSort(a,q+1,r); } }
对含有n个元素的数组a[0,n-1]进行快速排序,只要调用 quickSort(a,0,n-1)即可。
上述函数中的partition函数是快排的关键,以一个确定的基准元素a[p]对子数组a[p:r]进行划分。该函数返回下标q.
代码:
public int partition(int[] a, int p , int r){
int i = p;
int j = r+1;
int x = a[p];
// 将 < x 的元素交换到左边
// 将 > x 的元素交换到右边
while(true){
while( a[ ++ i] < x && i < r);
while( a[ -- j] > x);
if(i>=j) break;
Swap(a[i],a[j]);
}
a[p] = a[j];
a[j] = x;
return j;
}
以上是关于快速排序的主要内容,如果未能解决你的问题,请参考以下文章