快速排序用到的思想是分治思想,下面以数组A[p,r]为例说明快速排序的过程:
(1)数组经过一定的调整,可以划分为两个子数组,即A[p,q-1]和A[q-1,r],这两个数组满足,A[p,q-1]中的数据都小于等于A[q],而数组A[q-1,r]中的数据都大于A[q],其中计算下表q也是划分过程的一部分
(2)通过递归调用快速排序,对子数组A[p,q-1]和A[q-1,r]进行排序
(3)因为子数组都是原址排序的,因此不需要合并操作,数组A[p,r]已经是有序的
下面用伪代码说明排序的过程:
quicksort(A,p,r)
{
if(p<r)
{
q=partition(A,p,r);
quicksort(A,p,q-1);
quicksort(A,q-1,r)
}
}
partition(A,p,r)
{
x=A[r];
i=p-1;
for(j=0;j<=r-1;j++)
{
if(A[j]<x)
{
i=i+1;
temp=A[i];
A[i]=A[j];
A[j]=temp;
}
}
temp=A[i+1];
temp(i+1)=x;
x=temp(i+1);
return i+1;
}
下面用C++语言给出具体的快速排序的过程:
#include<iostream>
using namespace std;
int partition(int*A,int p,int r);
void quicksort(int*A,int p,int r);
void Display(int *A,int size);
int main()
{
int n,*a;
cout<<"请输入排序的个数:"<<endl;
cin>>n;
cout<<"请输入需要排序的数据:"<<endl;
a=(int*)malloc(n*sizeof(int));
for(int i=0;i<n;i++)
cin>>a[i];
quicksort(a,0,n-1);
Display(a,n);
return 0;
}
void quicksort(int *A,int p,int r) //快速排序
{
int q;
if(p<r) //如果p大于等于r 那么就程序不执行,非常重要
{
q = partition(A,p,r); //调用分治法 找到q的值
cout<<q;
quicksort(A,p,q-1);
quicksort(A,q+1,r);
}
}
int partition(int *A,int p,int r)
{
int x,i,j,temp;
x = A[r];
i = p-1;
for(j=p;j<=r-1;j++)
{
if(A[j]<x)
{
i=i+1;
temp=A[i];
A[i]=A[j];
A[j]=temp;
}
}
temp=A[i+1];
A[i+1]=A[r];
A[r]=temp;
return i+1;
}
void Display(int *A,int size) //打印函数
{
cout<<"排序结果为:"<<endl;
for(int i=0; i<size; i++) //打印数组
{
cout<<A[i]<<" ";
}
cout<<endl;
}