排序——计数、快速、归并排序模版

排序——计数、快速、归并排序模版

像冒泡、选择这些常见的排序就不在此写。
至于排序一些原理百度有很多,在此不赘述。

计数排序(桶+前缀和)

为什么感觉这个排序还不如桶排序?OVO

int a[500005],b[500005],c[500005];
int main()
{
	int n;
	cin >> n;
	int minn=inf,maxx=-1;
	for(int i=0;i<n;i++) 
	{
		cin >> a[i];
		minn=min(minn,a[i]);
		maxx=max(maxx,a[i]);
	}
	for(int i=0;i<n;i++)
		b[a[i]-minn+1]++;
	for(int i=1;i<=maxx-minn+1;i++)
		b[i]+=b[i-1];
	for(int i=0;i<n;i++)
		c[b[a[i]-minn]++]=a[i];
	for(int i=0;i<n;i++) cout << c[i] << ' ';
}

快速排序

int a[500005];
void quicksort(int l,int r)
{
	int i=l,j=r;
	int mid=(l+r)>>1;
	int x=a[mid];
	while(i<=j)
	{
		while(a[i]<x) i++;
		while(a[j]>x) j--;
		if(i<=j) 
		{
			swap(a[i],a[j]);
			i++,j--;
		}
	}
	if(l<j) quicksort(l,j);
	if(i<r) quicksort(i,r);
}

int main(int argc, char *argv[]) {
	int n;
	cin >> n;
	for(int i=0;i<n;i++) cin >> a[i];
	quicksort(0, n-1);
	for(int i=0;i<n;i++)
		cout << a[i] << ' ';
}

归并排序

int a[500005],b[500005];
int a[500005],b[500005];
void merge(int l,int mid,int r)
{
	int p1=l,p2 = mid + 1; //左右区间的第一个
	for(int i=l;i<=r;i++)
	{
		if((p1<=mid) && ((p2>r) || (a[p1] <= a[p2])))
		{
			b[i]=a[p1];
			p1++;
		}
		else {
			b[i]=a[p2];
			p2++;
		}
	}
	for(int i=l;i<=r;i++) a[i] = b[i];
}
void binary_merge(int l,int r)
{
	int mid=(l+r)>>1;
	if(l<r)
	{
		binary_merge(l, mid);
		binary_merge(mid+1, r);
	}
	merge(l,mid,r);
}
int main()
{
	int n;
	cin >> n;
	for(int i=0;i<n;i++) 
		cin >> a[i];
	binary_merge(0, n-1);
	for(int i=0;i<n;i++)
		cout << a[i] << ' ';
}

猜你喜欢

转载自blog.csdn.net/weixin_44235989/article/details/106500152