1. 快速排序的描述
像合并排序一样,快速排序也是基于分治模式的。下面是对一个典型子数组A[p..r]排序的分治过程的三个步骤:
分解:数组A[p..r]被划分成两个(可能空)子数组A[p..q-1]和A[q+1..r],使得A[p..q-1]中的每个元素都小于等于A[q],而且,小于等于A[q+1..r]中的元素。下标q也在这个划分过程中进行计算。
解决: 通过递归调硫,对子数组A[p..q-1]和A[q+1..r]排序
合并:因为两个子数组是就地排序的,将它们的合并不需要操作:整个数组和A[p..r]己排序。
下面的过程实现快速排序:
Quicksort(A,p,r)
if p<r
then q = Partition(A,p,r)
Qurcksort(A,p,q-1);
Qurcksort(A,q+1,r);
为排序一个完整的数组A,jbpur调用是Qurcksort(A,0,length[A]-1)(有0号元素)
数组划分
快速排序算法的关键是Partition过程,它对子数组A[p..r]进行就地重排:
Partition(A,p,r)
x = A[r];
i = p-1;
for j = p to r-1
do if A[j]<=x
then i = i+1;
Exchange (A[i],A[j])
Exchange(A[i+1],A[r])
return i+1;
C++ 语言实现程序如下。。。可直接复制运用。。。
#include<iostream> using namespace std; void Exchange(int &a,int &b) { int i = a; a = b; b = i; }; int Partition(int *A,int p,int r) { int x = A[r]; int i = p-1; for(int j = p;j<r;j++) { int y = A[j]; if(A[j]<=x) { i++; Exchange(A[i],A[j]); } } Exchange(A[i+1],A[r]); return i+1; }; void Quicksort(int *A,int p,int r) { if(p<r) { int q = Partition(A,p,r); Quicksort(A,p,q-1); Quicksort(A,q+1,r); } }; void main() { int A[8] = {2,8,7,1,3,5,6,4}; Quicksort(A,0,7); for(int i = 0;i<8;i++) { cout<<A[i]<<endl; } }