排序篇(c++/c实现)

基础篇:

冒泡排序

特点:较为容易想到,是初学者耳熟能详的排序算法

优点:代码精练,易懂

缺点:效率不够高,一般比赛中可能会超时

代码:

#include<cstdio>
using namespace std;
int a[10000001];
int main()
{
    int n;scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    for(int i=1;i<=n-1;i++)
    for(int j=1;j<=n-i;j++)
    {
        if(a[j]>a[j+1])
        {
            int sb=a[j];a[j]=a[j+1];a[j+1]=sb;
        }
    }
    for(int i=1;i<=n;i++)printf("%d ",a[i]);
}

中级篇:

简易“桶排序”

特点:可以用来排序并过滤掉重复部分

优点:速度快,简洁易懂

缺点:过分浪费内存(没有离散化的思想),遇到稍微大点的数字数组就不够开,限制性较大

代码:(原代码丢了,用图片代替)

提高篇:

快速排序

特点:利用二分思想

优点:速度较快,用途广

缺点:无

代码:

#include<cstdio>
using namespace std;
int a[10000001];
void qsort(int left,int right)
{
    if(left>right)return;
    int i,j,temp;
    temp=a[left];
    i=left;j=right;
    while(i!=j)
    {
        while(a[j]>=temp&&i<j)j--;
        while(a[i]<=temp&&i<j)i++;
        if(i<j)
        {
            int sb=a[j];a[j]=a[i];a[i]=sb;
        }
    }
    a[left]=a[i];a[i]=temp;
    qsort(left,i-1);qsort(i+1,right);
}
int main()
{
    int n;scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    qsort(1,n);
    for(int i=1;i<=n;i++)printf("%d ",a[i]);
}

当然。若你不想手打代码,可以用algorithm库里自带的快排,

用法:(假设初始位置为0)sort(a,a+n)

技巧篇:

归并排序

特点:将两个有序数组合并为一个有序数组

优点:面对有序情况效率较高

缺点:有序的规定限制了它的用途

用法:

merge(数组A起位置,数组A终位置,数组B起位置,数组B终位置,排序结果储存数组的起位置,比较函数);
原文地址:https://www.cnblogs.com/muzu/p/6684988.html