选择排序 冒泡排序 快速排序 归并排序模板 逆序对

快排和归并排序可以记一下

#include <iostream>
#include <bits/stdc++.h>

using namespace std;

int n,a[100005],tmp[100005];

//稳定的排序:直接插入排序、冒泡排序、归并排序、桶排序 
//不稳定的排序:希尔排序、直接选择排序、堆排序、快速排序

//简单选择排序,最好O(n2),不稳定:比如:5 5 1 
void selsort()
{
	for(int i=0;i<n-1;++i)//起点 
	{
		int k=i;
		for(int j=i;j<n;++j)
		{
			if(a[j]<a[k])k=j;
		}
		swap(a[k],a[i]);
	}
}
//带标记的冒泡排序,最好O(n) 稳定 
void maosort()
{
	for(int i=n-1;i>=1;--i)//终点 
	{
		bool ok=true;
		for(int j=0;j<i;++j)
		{
			if(a[j]>a[j+1])
			{
				swap(a[j],a[j+1]);
				ok=false;
			}
		}
		if(ok)break;
	} 
}
//快速排序 递归 
void quick_sort(int l,int r)
{
	if(l>=r)return;
    int i=l-1,j=r+1,x=a[l+r>>1];
    while(i<j)
    {
        do i++;while(a[i]<x);
        do j--;while(a[j]>x);
        if(i<j)swap(a[i],a[j]);
    }
    quick_sort(l,j);
    quick_sort(j+1,r);
} 
//归并排序 递归 
void  merge_sort(int l,int r)
{
	if(l>=r)return;
	int mid=l+r>>1;
	merge_sort(l,mid);
	merge_sort(mid+1,r);
	int k=0,i=l,j=mid+1;
	while(i<=mid&&j<=r)
	{
		if(a[i]<=a[j])tmp[k++]=a[i++];
		else tmp[k++]=a[j++];
	}
	while(i<=mid)tmp[k++]=a[i++];
	while(j<=r)tmp[k++]=a[j++];
	for(int i=l,j=0;i<=r;++i,++j)a[i]=tmp[j];
}
int main()
{
	cin>>n;
	for(int i=0;i<n;++i)cin>>a[i];
	//quick_sort(0,n-1);
	maosort(); 
	//selsort();
	//merge_sort(0,n-1);
	for(int i=0;i<n;++i)cout<<a[i]<<" ";
	return 0;
} 
posted @ 2022-11-17 23:04  林动  阅读(13)  评论(0编辑  收藏  举报