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

24 篇文章 1 订阅

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

#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;
} 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wow_awsl_qwq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值