算法导论的快速排序还和一般书上的快速排序是有点不一样的。
当然书习题也给出了一般快速排序的方法,其分区函数学名叫Hoare partition。
书本介绍的排序可以用图看的很清晰:
然后配合C++程序,就不需要废话就能明白了:
- //C++'s array range should be [low, up], the same as [low, up+1)
- int partition(vector<int> &vi, int low, int up)
- {
- int pivot = vi[up];
- int i = low-1;
- for (int j = low; j < up; j++)
- {
- if(vi[j] <= pivot)
- {
- i++;
- swap(vi[i], vi[j]);
- }
- }
- swap(vi[i+1], vi[up]);
- return i+1;
- }
//C++'s array range should be [low, up], the same as [low, up+1)
int partition(vector<int> &vi, int low, int up)
{
int pivot = vi[up];
int i = low-1;
for (int j = low; j < up; j++)
{
if(vi[j] <= pivot)
{
i++;
swap(vi[i], vi[j]);
}
}
swap(vi[i+1], vi[up]);
return i+1;
}
他的quick sort程序也很明了,值得注意到的地方就是,mid是已经到了最终排序位置的了,所以,不需要递归考虑这个位置了。
- //C++'s array range should be [low, up], the same as [low, up+1)
- void quickSort(vector<int> &vi, int low, int up)
- {
- if(low < up)
- {
- int mid = partition(vi, low, up);
- //Watch out! The mid position is on the place, so we don't need to consider it again.
- //That's why below is mid-1, not mid! Otherwise it will occur overflow error!!!
- quickSort(vi, low, mid-1);
- quickSort(vi, mid+1, up);
- }
- }
//C++'s array range should be [low, up], the same as [low, up+1)
void quickSort(vector<int> &vi, int low, int up)
{
if(low < up)
{
int mid = partition(vi, low, up);
//Watch out! The mid position is on the place, so we don't need to consider it again.
//That's why below is mid-1, not mid! Otherwise it will occur overflow error!!!
quickSort(vi, low, mid-1);
quickSort(vi, mid+1, up);
}
}
增加一个adaptor功能函数:
- void qSort(vector<int> &vi)
- {
- quickSort(vi, 0, vi.size()-1);
- }
void qSort(vector<int> &vi)
{
quickSort(vi, 0, vi.size()-1);
}
最后是测试主函数:
- int main()
- {
- int a[] = {3,5,7,9,2,3,1,0,7,5,4};
- vector<int> va(a, a+11);
- cout<<"Before quicksort:\n";
- for(auto x:va)
- cout<<x<<" ";
- cout<<endl;
- qSort(va);
- cout<<"After quicksort:\n";
- for(auto x:va)
- cout<<x<<" ";
- cout<<endl;
- system("pause");
- return 0;
- }
int main()
{
int a[] = {3,5,7,9,2,3,1,0,7,5,4};
vector<int> va(a, a+11);
cout<<"Before quicksort:\n";
for(auto x:va)
cout<<x<<" ";
cout<<endl;
qSort(va);
cout<<"After quicksort:\n";
for(auto x:va)
cout<<x<<" ";
cout<<endl;
system("pause");
return 0;
}
结果:
- int partition(vector<int> &A, int p,int r)
- {
- int x=A[r];
- int i=p-1;
- for(int j=p;j<r;j++){
- if (A[j]<x)
- {
- i=i+1;
- swap(A[i],A[j]);
- }
- }
- swap(A[i+1],A[r]);
- return i+1;
- }
- void quicksort(vector<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);
- }
- }
- int main()
- {
- int a[]={2,8,7,1,3,5,6,4};
- vector<int> A(a,a+8);
- vector<int>::iterator iter ;
- cout<<"Before:\t";
- for(iter=A.begin();iter!=A.end();iter++)
- {
- cout<<*iter<<"\t";
- }
- cout<<endl;
- quicksort(A,0,A.size()-1);
- cout<<"After:\t";
- for(iter=A.begin();iter!=A.end();iter++)
- {
- cout<<*iter<<"\t";
- }
- cout<<endl;
- cin.get();
- return 0;
- }
int partition(vector<int> &A, int p,int r)
{
int x=A[r];
int i=p-1;
for(int j=p;j<r;j++){
if (A[j]<x)
{
i=i+1;
swap(A[i],A[j]);
}
}
swap(A[i+1],A[r]);
return i+1;
}
void quicksort(vector<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);
}
}
int main()
{
int a[]={2,8,7,1,3,5,6,4};
vector<int> A(a,a+8);
vector<int>::iterator iter ;
cout<<"Before:\t";
for(iter=A.begin();iter!=A.end();iter++)
{
cout<<*iter<<"\t";
}
cout<<endl;
quicksort(A,0,A.size()-1);
cout<<"After:\t";
for(iter=A.begin();iter!=A.end();iter++)
{
cout<<*iter<<"\t";
}
cout<<endl;
cin.get();
return 0;
}