排序几个常用方法汇总一下

一、STL之sort

#include<bits/stdc++.h>//万能头(贼爽,但别把变量名设成其他关键字) 
#define F(i,n,m) for(int i=n;i<=m;i++)//灵性define,减少码量(for打得我烦) 
using namespace std;
int a[10000001];
int main()
{
    
    
	int n;
	cin>>n;
	F(i,1,n)
	cin>>a[i];//输入 
	
	random_shuffle(a+1,a+n+1); //打乱它 
	sort(a+1,a+n+1);//快排(终究我还是用了STL的sort) 
	
	F(i,1,n)
	cout<<a[i]<<' ';//输出 
	return 0;
}

二、二分手打sort

#include<bits/stdc++.h>
#defind F(i,n,m) for(int i=n;i<=m;i++)
using namespace std;
int n,a[1000001];
void mysort(int l,int r)//自己写的快排 
{
    
    
    int mid=a[(l+r)/2];//找中间的数进行2分 
    int i=l,j=r;
    do{
    
    
        while(a[i]<mid)
		i++;//找左半部分大于中间数的 
        while(a[j]>mid)
		j--;//找右半部分小于中间数的 
        if(i<=j)
        {
    
    
            swap(a[i],a[j]);//换位 
            i++;//左指针右移 
            j--;//右指针左移 
        }
    }
	while(i<=j);
    if(l<j) mysort(l,j);
    if(i<r) mysort(i,r);
}
int main()
{
    
    
    cin>>n;
    F(i,1,n)
    cin>>a[i];
    random_shuffle(a+1,a+n+1); //打乱它 
    mysort(1,n);//快排 
    F(i,1,n)
    cout<<a[i]<<' ';//输出 
    return 0;
}

三、STL堆排序

#include<bits/stdc++.h>
#define F(i,n,m) for(int i=n;i<=m;i++)
using namespace std;
int main()
{
    
    
	priority_queue<int,vector<int>,greater<int> > q;//小根堆
	int n,x;
	cin>>n;
	F(i,1,n)
	{
    
    
		cin>>x;
		q.push(x);
	}
	F(i,1,n)
	{
    
    
		cout<<q.top()<<' ';
		q.pop();
	}
	return 0;
}

四、桶排序

#include<bits/stdc++.h>
#define F(i,n,m) for(int i=n;i<=m;i++)
using namespace std;
int main()
{
    
    
	map<int,int> a;
	int n;
	cin>>n;
	F(i,1,n)
	{
    
    
		int x;
		cin>>x;
		a[x]++;
	}
	map<int,int>::iterator it=a.begin();
	for(it;it!=a.end();it++)
	{
    
    
		aa:;
		if(it->second==0) continue;
		cout<<it->first<<' '; it->second--; goto aa;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_51408826/article/details/127637232