• 归并排序 与 快排 模板


    归并排序:复杂度nlogn
    快排:复杂度一般情况下nlogn 最坏情况下 n*n
    归并排序:

    //可以用于求解逆序数
    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    typedef long double db;
    typedef pair<int,int> pii;
    typedef vector<int> vi;
    #define de(x) cout << #x << "=" << x << endl
    #define rep(i,a,b) for(int i=a;i<(b);++i)
    #define all(x) (x).begin(),(x).end()
    #define sz(x) (int)(x).size()
    #define mp make_pair
    #define pb push_back
    #define fi first
    #define se second
    const int N = 5e5+5;
    int a[N],b[N];
    int ans=0;
    void merge(int l,int mid,int r)
    {
    	int i,j,k;
    	k=l;i=l;j=mid+1;
    	while(i<=mid&&j<=r)
    	{
    		if(a[i]>a[j]) 
    		{
    			b[k++]=a[j++];
    			ans+=mid-i+1;
    		}
    		else 
    		{
    			b[k++]=a[i++];
    		}
    	}
    	while(i<=mid) b[k++]=a[i++];
    	while(j<=r) b[k++]=a[j++];
    	for(i=l;i<=r;i++) a[i]=b[i];
    }
    void mergesort(int l,int r)
    {
    	int mid=(l+r)>>1;
    	if(l==r) return;
    	mergesort(l,mid);
    	mergesort(mid+1,r);
    	merge(l,mid,r);
    }
    int main()
    {
    	int n;
    	while(1)
    	{
    		scanf("%d",&n);
    		if(n==0) break;
    		ans=0;
    		for(int i=1;i<=n;i++)
    		{
    			scanf("%d",&a[i]); 
    		}
    		mergesort(1,n);
    		cout<<ans<<endl;
    	}
    	return 0;
    }
    

    快排:

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    typedef long double db;
    typedef pair<int,int> pii;
    typedef vector<int> vi;
    #define de(x) cout << #x << "=" << x << endl
    #define rep(i,a,b) for(int i=a;i<(b);++i)
    #define all(x) (x).begin(),(x).end()
    #define sz(x) (int)(x).size()
    #define mp make_pair
    #define pb push_back
    #define fi first
    #define se second
    const int N = 1e5+5;
    int a[N];
    int partition(int l,int r)
    {
    	int i=l-1,j=r,temp;
    	int tmp=a[r];
    	/*将大于等于x的元素交换到右区域*/
    	/*小于等于交换到左区域*/
    	while(1)
    	{
    		while(a[++i]<tmp);
    		while(tmp<a[--j]) if(j==l) break;
    		if(i>=j) break;
    		temp=a[i];
    		a[i]=a[j];
    		a[j]=temp;
    	}
    	temp=a[r];
    	a[r]=a[i];
    	a[i]=temp;
    	return i;
    }
    void qsort(int l,int r)
    {
    	int i;
    	if(r<=l) return ;
    	i = partition(l,r);
    	qsort(l,i-1);
    	qsort(i+1,r);
    } 
    
    int main()
    {
    	int n;
    	scanf("%d",&n);
    	for(int i=1;i<=n;i++)
    	{
    		scanf("%d",&a[i]);
    	}
    	qsort(1,n);
    	for(int i=1;i<=n;i++) printf("%d%c",a[i],i==n ? '
    ':' ');
    }
    
  • 相关阅读:
    vector 向量容器用法祥解
    stdafx.h 的作用
    vector 利用swap 函数进行内存的释放 vector<int>().swap
    LPCTSTR LPCWSTR LPCSTR 含义
    Application->ProcessMessages();
    sizeof 和 strlen 的区别
    程序编译没错,运行报错:无法定位程序输入点GT_BufLaserFollowRatio(这是函数)于动态链接库GTS.DLL上
    用户登录注销功能
    在项目开发中经常用到的全局函数
    在项目开发中经常用到的全局函数2
  • 原文地址:https://www.cnblogs.com/q1076452761/p/7711275.html
Copyright © 2020-2023  润新知