写在最前面:

此系列中的所有模板全为大佬所写,我只是一个搬运工(?)。

记录:

在之前学的所有最经典的排序方法中,理解简单是真简单,超时也是真超时......所以有了以下的算法。这几个方法速度应该是差不了多少的。

快速排序:

  • 快速排序是先从数组中随意选择一个点,然后把该数字定为评判标准,比较其他数字和该数字的关系。如果比该数字大放在后面,小则放在前面(让大的和小的交换)。然后递归计算,最后将全部数字进行排序。

下面是模板:

#include <iostream>
#include<cstdio>
using namespace std;
int n;
int a[110000];
void quicksort(int *a,int l,int r)
{
    if(l>=r)//判断有一个数或者没有数字
        return;
    int x=a[l],i=l-1,j=r+1;//先运算后比较,所以比两头数据小
    while (i<j)
    {
        do i++;while (a[i]<x);//如果想要降序那么把符号改变即可
        do j--;while (a[j]>x);
        if(i<j)//用if表示判断
        swap(a[i],a[j]);
    }
    quicksort(a,0,j);
    quicksort(a,j+1,r);
}
int main()
{
    scanf("%d",&n);
    for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
    quicksort(a,0,n-1);
     for(int i=0;i<n;i++)
        printf("%d ",a[i]);
    return 0;
}

归并排序:

  • 归并排序是稳定排序(快排不是),归并排序要使用到中间数组。先从中间划分好区间,然后用递归把前面的所有数据进行排序。在排序是把两个区间的数字按照顺序存到一个新的数组中,然后再次存回原来的数组,从而完成排序。

下面是模板:

#include <iostream>
#include<cstdio>
using namespace std;
int n;
int a[110000],tmp[110000];
void mergesort(int *a,int l,int r)
{
    if(l>=r)
        return;
    int mid =(l+r)>>1;//l+r的值右移1位,相当l+r的值除以2取整。
    mergesort(a,l,mid);
    mergesort(a,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++];//运算完成后k自增1,i自增1
        else tmp[k++]=a[j++];
    }
    while (i<=mid)//注意等号
        tmp[k++]=a[i++];
    while (j<=r)
        tmp[k++]=a[j++];
    for(i=l,j=0;i<=r;i++,j++)
        a[i]=tmp[j];
}
int main()
{
    scanf("%d",&n);
    for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
    mergesort(a,0,n-1);
    for(int i=0;i<n;i++)
    printf("%d ",a[i]);
    return 0;
}

其他排序:

在cstdlib里面的qsort和在algorithm里面的sort也是不错的选择。

qsort:(这里以整数数组为例)

qsort(数组名,数组成员个数,数据流行大小,cmp);
int cmp(const void*a,const void *b)
{
   int* pa=(int*)a;
   int* pb=(int*)b;
   int num1=*pa;
   int num2=*pb;
   return num1-num2;//从大到小排序。
}

sort

sort默认的是从小到大排序,用法sort(开始的地址,结束的地址)如果需要其他排序方法,则sort(begin,end,cmp)cmp为特定的排序方法。

构体内嵌套比较函数

这个......就是解决在结构体内使用sort的问题。

struct node//结构体名
{
   int l,r;
   bool operator < (const node &a)const
   {
   return r<a.r;
   }
};