zoukankan      html  css  js  c++  java
  • 基本排序算法之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]的中间值。

  • 相关阅读:
    java fastJson
    动态 商品属性
    添加营业时间
    ivew 表格中的input数据改变就会失去焦点
    小程序-setData
    小程序 css3走马灯效果
    iview 表单验证
    vue iview tree checked改变 不渲染的问题
    pl/sql中文乱码
    sql-plus无法连接解决
  • 原文地址:https://www.cnblogs.com/jwk000/p/3116862.html
Copyright © 2011-2022 走看看