快排和归并排序可以记一下
#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];
//for(int i=0;i<k;++i)a[i+l]=tmp[i];//一个变量搞定
}
void mergesort(int a[],int l,int r){
if(l>=r)return;
int mid=l+r>>1;
mergesort(a,l,mid);
mergesort(a,mid+1,r);
int i=l,j=mid+1,k=0;
while(i<=mid&&j<=r){
if(a[i]<=a[j])temp[k++]=a[i++];
else temp[k++]=a[j++];
}
while(i<=mid)temp[k++]=a[i++];
while(j<=mid)temp[k++]=a[j++];
for(int i=0;i<k;++i)a[i+l]=temp[i];
}
//插入排序
void cha(){
int i,j,t;
for(i=1;i<n;++i){
t=a[i];
for(j=i-1;j>=0&&a[j]>t;j--){
a[j+1]=a[j];
}
a[j+1]=t;
}
}
//二分插入排序
void cha2(){
int i,j,l,r,t,mid;
for(int i=1;i<n;++i){
t=a[i];
l=0,r=i-1;
while(l<=r){
mid=(l+r)/2;
if(a[mid]>t)r=mid-1;
else l=mid+1;
}
if(l==i)continue;//边界情况
for(j=i-1;j>=l;j--){
a[j+1]=a[j];
}
a[l]=t;
}
}
//希尔排序 时间复杂度O(n^1.3)
void shell(){
int i,j,d,t;
for(d=n/2;d>=1;d/=2){//d/=2是不会漏掉d=1的那一轮的,其他的都可能会,如2/3,d=2后就直接d=0了这样没法保证正确
for(i=d;i<n;++i){
t=a[i];
for(j=i-d;j>=0&&a[j]>t;j-=d){
a[j+d]=a[j];
}
a[j+d]=t;
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin>>n;
for(int i=0;i<n;++i)cin>>a[i];
//quick_sort(0,n-1);
// maosort();
//selsort();
//merge_sort(0,n-1);
// cha2();
// shell();
// sort(a,a+n);
for(int i=0;i<n;++i)cout<<a[i]<<" ";
return 0;
}