zoukankan      html  css  js  c++  java
  • 归并排序 与 快排 模板

    归并排序:复杂度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 ? '
    ':' ');
    }
    
  • 相关阅读:
    安装 OSS-FTP 时出现 ImportError: No module named gtk的解决
    Two Sum III
    两线程交叉打印奇偶数
    /dev/kvm device: permission denied Deepin Ubuntu AndroidStudio
    05webpack-webpack-dev-server时时跟新-第2种方式
    04webpack--webpack-dev-server 时时跟新
    03webpack--输入webpack--自动打包
    02-webpack的基本配置-运行webpack
    01-day-什么是webpack
    学习51cto中美团中的小知识点--组件实现按需求加载
  • 原文地址:https://www.cnblogs.com/q1076452761/p/7711275.html
Copyright © 2011-2022 走看看