快速排序的三种不同的实现方式。

    1. 快速排序的常规方法,运用动态数组来储存要排序的序列, 然后调用C语言的库函数qsort() ,  函数其原型为: void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) ); , 至于这个compare 参数真的让人讨厌,还好<cstdlib> 提供了qsort 函数,让代码尽量的缩短。

其代码的实现为:

</pre><pre name="code" class="cpp">#include<iostream>
#include<cstdlib>
using namespace std ; 

int Compare(const void *arg1 , const void *arg2)
{
	return (*(int*)arg1 < *(int*)arg2) ? -1 : 
	(*(int*)arg1 > *(int*)arg2)? 1: 0 ; 
}

int main(void)
{
	int i = 0  , n ; 
	cout<<"请输入整数数组的序列,按任意非数字键结束:\n" ; 
	cin>>n ; 
	int *arr_Num = new int[n] ; 
	for(i = 0 ; i < n ; ++i)            
	{
		cin>>arr_Num[i] ; 
	} 
	qsort(arr_Num , n , sizeof(int) , Compare) ;            //排序
	cout<<"排序后:"<<endl ; 
	for(i = 0 ; i < n ; ++i)
	{
		cout<<arr_Num[i]<<' ' ; 
	}
	cout<<endl ; 
	return  0 ; 
}
      2. 我们灵活的应用c++的STL来完成此程序, <algorithm>提供的sort() 的函数原型为:    template<class RanIt> voidsort(RanIt first, RanIt last); 看起来比上面一个漂亮多了, 至少木有那个讨厌的compare(),函数了。

其代码的实现为:


#include<iostream>
#include<algorithm>                                    //提供sort()函数
#include<vector>
using namespace std ; 

int main(void)
{
	vector<int>vec_Num ;                                //存放序列的向量
	int n  ;                                            //要排序的个数
	int element  , i = 0 ; 
	cout<<"请输入序列的个数:"<<endl ; 
	cin>>n ; 
	cout<<"请输入整数序列,按任意的数字键结束输入:\n" ; 
	for(i = 0 ; i < n ; ++i)
	{
		cin>>element ; 
		vec_Num.push_back(element) ; 
	}
	sort(vec_Num.begin() , vec_Num.end()) ; 
	for(i = 0 ; i < n ; ++i)
	{
		cout<<vec_Num[i]<<' ' ; 
	}
	cout<<endl ; 
	return 0 ; 
}

      3. 我们用泛型算法与STL巧妙的结合,来完成此程序.

其代码的实现为:

#include<iostream>
#include<algorithm>              //提供sort()函数
#include<vector>
#include<iterator>               //为了使用输入输出的迭代器
using namespace std ; 

int main(void)
{
	typedef vector<int> IntVector ; 
	typedef istream_iterator<int> IstreamItr ; 
	typedef ostream_iterator<int> OstreamItr ; 
	typedef back_insert_iterator<IntVector> BackInsItr ;  
	IntVector vec_Num ; 
	cout<<"请输入整数序列,按任意非数字键结束输入:"<<endl ;
	copy(IstreamItr(cin) , IstreamItr() , BackInsItr(vec_Num)) ;            //输入数据
	sort(vec_Num.begin() , vec_Num.end()) ; 
	cout<<"排序后:"<<endl ; 
	copy(vec_Num.begin() , vec_Num.end() , OstreamItr(cout , " ")) ;       //输出数据
	cout<<endl ; 
	return 0 ; 
}

copy()函数的原型为: template<class InIt, class OutIt>     OutIt copy(InIt first, InIt last, OutIt x);

至于使用back_insert_iterator迭代器,就是引导copy 算法每次在容器末端插入一个数据,如果不使用它的话,

vector<int> 容器的数据个数超出范围。






  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值