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;
}
}