• 基本排序算法之3——快速排序quicksort


    快排的思路就不说了,中轴分组,借助一个临时单元。时间复杂度O(NlogN)。下面是实现:

    #include<iostream>
    using namespace std;
    
    template<typename T>
    bool _less(T a,T b)
    {
    	return a<b;
    }
    
    template<typename T,typename F>
    void qsort(T a[],int n,F f=_less<T>)
    {
    	if(n<2)return;
    	int first=0,last=n-1;
    	T temp=a[0];
    	while(first!=last)
    	{
    		while(first!=last && !f(a[last],temp))last--;
    		a[first]=a[last];
    		while(first!=last && f(a[first],temp))first++;
    		a[last]=a[first];
    	}
    	a[first]=temp;
    	qsort(a,first,f);
    	qsort(a+last+1,n-last-1,f);
    }
    
    template<typename T>
    void show(T a[],int n)
    {
    	for(int i=0;i<n;++i)
    	{
    		cout<<a[i]<<' ';
    	}
    	cout<<endl;
    }
    
    int main()
    {
    	float a[]={3.22,4.6,1.27,9.81,5.5,0.12,2.75,6.7,7.01,8.32};
    	qsort(a,10,_less<float>);
    	show(a,10);
    	return 0;
    }
    

      注意几点:

        1.模板类支持默认模板参数。模板函数或者成员模板函数不支持默认模板参数(STL里的sort是通过重载了两份函数支持第三个参数!而不是用默认模版参数!!)

        2.模版函数调用不要写类型参数,编译器自动推断。

        3.递归的关键就在于边界条件是否考虑完全。

        4.参考书表示:选取第一个元素为中枢是错误的,常用的是三分中值分割法(Median of Three Partitioning)!!就是取a[first]、a[last]、a[(first+last)/2]的中间值。

  • 相关阅读:
    python——ddt + excel + HTMLTestRunner 实现接口测试
    APP模拟弱网环境测试教程
    静态语言与动态语言
    Charles手机抓包实用教程
    DS博客作业08--课程总结
    DS博客作业03--栈和队列
    DS博客作业02--线性表
    DS博客作业01--日期抽象数据类型设计与实现
    第四次作业
    C博客作业01--分支、顺序结构
  • 原文地址:https://www.cnblogs.com/jwk000/p/3116862.html
Copyright © 2020-2023  润新知