[算法导论]快速排序

本文深入探讨了快速排序算法的实现细节,包括快速排序的基本原理、Hoare分区函数、C++实现方式以及如何通过增加适配器函数简化使用过程,并通过测试案例验证算法的有效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

算法导论的快速排序还和一般书上的快速排序是有点不一样的。

当然书习题也给出了一般快速排序的方法,其分区函数学名叫Hoare partition。

书本介绍的排序可以用图看的很清晰:

然后配合C++程序,就不需要废话就能明白了:

  1. //C++'s array range should be [low, up], the same as [low, up+1)  
  2. int partition(vector<int> &vi, int low, int up)  
  3. {  
  4.     int pivot = vi[up];  
  5.     int i = low-1;  
  6.     for (int j = low; j < up; j++)  
  7.     {  
  8.         if(vi[j] <= pivot)  
  9.         {  
  10.             i++;  
  11.             swap(vi[i], vi[j]);  
  12.         }  
  13.     }  
  14.     swap(vi[i+1], vi[up]);  
  15.     return i+1;  
  16. }  
//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是已经到了最终排序位置的了,所以,不需要递归考虑这个位置了。

  1. //C++'s array range should be [low, up], the same as [low, up+1)  
  2. void quickSort(vector<int> &vi, int low, int up)  
  3. {  
  4.     if(low < up)  
  5.     {  
  6.         int mid = partition(vi, low, up);  
  7.         //Watch out! The mid position is on the place, so we don't need to consider it again.  
  8.         //That's why below is mid-1, not mid! Otherwise it will occur overflow error!!!  
  9.         quickSort(vi, low, mid-1);  
  10.         quickSort(vi, mid+1, up);  
  11.     }  
  12. }  
//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功能函数:

  1. void qSort(vector<int> &vi)  
  2. {  
  3.     quickSort(vi, 0, vi.size()-1);  
  4. }  
void qSort(vector<int> &vi)
{
	quickSort(vi, 0, vi.size()-1);
}

 


最后是测试主函数:

  1. int main()  
  2. {  
  3.     int a[] = {3,5,7,9,2,3,1,0,7,5,4};  
  4.     vector<int> va(a, a+11);  
  5.   
  6.     cout<<"Before quicksort:\n";  
  7.     for(auto x:va)  
  8.         cout<<x<<" ";  
  9.     cout<<endl;  
  10.   
  11.     qSort(va);  
  12.   
  13.     cout<<"After quicksort:\n";  
  14.     for(auto x:va)  
  15.         cout<<x<<" ";  
  16.     cout<<endl;  
  17.     system("pause");  
  18.     return 0;  
  19. }  
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;
}

 


结果:

 

 

  1. int partition(vector<int> &A, int p,int r)  
  2. {  
  3.     int x=A[r];  
  4.     int i=p-1;  
  5.     for(int j=p;j<r;j++){  
  6.         if (A[j]<x)  
  7.         {  
  8.             i=i+1;  
  9.             swap(A[i],A[j]);  
  10.         }  
  11.     }  
  12.        
  13.     swap(A[i+1],A[r]);  
  14.     return i+1;  
  15. }  
  16.   
  17. void quicksort(vector<int> &A, int p,int r)  
  18. {  
  19.     if (p<r)  
  20.     {  
  21.         int q=partition(A,p,r);  
  22.         quicksort(A,p,q-1);  
  23.         quicksort(A,q+1,r);  
  24.     }  
  25. }  
  26.   
  27. int main()  
  28. {  
  29.     int a[]={2,8,7,1,3,5,6,4};  
  30.     vector<int> A(a,a+8);  
  31.     vector<int>::iterator iter ;  
  32.     cout<<"Before:\t";  
  33.     for(iter=A.begin();iter!=A.end();iter++)  
  34.     {  
  35.         cout<<*iter<<"\t";  
  36.     }  
  37.     cout<<endl;  
  38.     quicksort(A,0,A.size()-1);  
  39.     cout<<"After:\t";  
  40.     for(iter=A.begin();iter!=A.end();iter++)  
  41.     {  
  42.         cout<<*iter<<"\t";  
  43.     }  
  44.     cout<<endl;  
  45.     cin.get();  
  46.     return 0;  
  47. }  
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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值