快速排序的描述:
分解:数组A[p..r]被划分为两个(可能为空)子数组A[p..q-1]和A[q+1..r],使得A[p..q-1]中的每一个元素都小于等于A[q],A[q+1..r]中的每一个元素都大于等于A[q]。其中,计算下标q也是划分过程中的一部分
解决:通过递归调用快速排序,对子数组A[p..q-1]和A[q+1..r]进行排序。
合并:因为子数组都是原址排序的,所以不需要合并操作:A[p..r]已经有序。
下面的伪代码实现快速排序:
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)
为了排序一个数组A的全部元素,初始调用是QUICKSORT(A,1,A.length)。
数组的划分:
算法的关键部分是PARTITION过程,它实现了对子数组A[p..r]的原址重排。
PARTITION(A,p,r)
1 x=A[r]
2 i=p-1
3 for j=p to r-1
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;
下面贴出完整的代码
#include<iostream>
using namespace std;
int Partition(int* A,int p,int r)
{
int x,i,j,temp;
x=A[r];
i=p-1;
for(j=p;j<r;j++)
{
if(A[j]<x)
{
++i;
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 QuickSort(int* A,int p,int r)
{
if(p<r)
{
int q=Partition(A,p,r);
QucikSort(A,p,q-1);
QuickSort(A,q+1,r);
}
return;
}
void Display(int* A,int size)
{
for(int i=0;i<size;i++)
{
cout<<A[i]<<" ";
}
}
int main()
{
//int number[]={3,8,6,4,9,1,5,2,7};
//QuickSort(number,0,8);
//Display(number,9);
int length;
int* A;
while(1)
{
cout<<"请输入数组的长度"<<endl;
cin>>length;
if(length>0)
{
cout<<"请输入数组中的元素"<<endl;
A=(int*)malloc(sizeof(int)*length);
for(int i=0;i<length;i++)
{
cin>>A[i];
}
QuickSort(A,0,length-1);
Display(A,length);
}
}
system("pause");
return 0;
}