选择排序 冒泡排序 快速排序 归并排序模板 逆序对
快排和归并排序可以记一下
#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;
}