排序集锦

应老师要求,向新入队或将要入队的队员写辅导书,果断先抢了排序算法~~代码如下,全手写,留作纪念

const int MAXN=100005;
void bubble_sort(int a[],int n)//冒泡排序
{
    for(int i=0; i<n-1; i++)
    {
        for(int j=0; j<n-1; j++)
        {
            if(a[j]>a[j+1])
            {
                int t=a[j];
                a[j]=a[j+1];
                a[j+1]=t;
            }
        }
    }
}
void choose_sort(int a[],int n)//选择排序
{
    for(int i=0; i<n-1; i++)
    {
        int k=i;
        for(int j=i+1; j<n; j++)
        {
            if(a[k]>a[j])
                k=j;
        }
        if(k!=i)
        {
            int t=a[k];
            a[k]=a[i];
            a[i]=t;
        }
    }
}
void insert_sort(int a[],int n)//插入排序
{
    for(int i=1; i<n; i++)
    {
        int t=a[i],j;
        for(j=i; j>0; j--)
        {
            if(t<a[j-1])
                a[j]=a[j-1];
            else
                break;
        }
        a[j]=t;
    }
}
int b[MAXN];
void merge(int a[],int left,int mid,int right)//归并排序Pt.1
{
    int i,j,k;
    i=k=left,j=mid+1;
    while(i<=mid&&j<=right)
    {
        if(a[i]<=a[j])
            b[k++]=a[i++];
        else
            b[k++]=a[j++];
    }
    while(i<=mid)
        b[k++]=a[i++];
    while(j<=right)
        b[k++]=a[j++];
    memcpy(a+left,b+left,(right-left+1)*sizeof(int));
}
void merge_sort(int a[],int left,int right)//归并排序Pt.2
{
    if(left>=right)
        return;
    int mid=(left+right)/2;
    merge_sort(a,left,mid);
    merge_sort(a,mid+1,right);
    merge(a,left,mid,right);
}
int partition(int a[],int left,int right)//快速排序Pt.1
{
    int x=a[right],i=left-1,j;
    for(j=left;j<right;j++)
    {
        if(a[j]<=x)
        {
            int t=a[++i];
            a[i]=a[j];
            a[j]=t;
        }
    }
    a[right]=a[++i];
    a[i]=x;
    return i;
}
void quick_sort(int a[],int left,int right)//快速排序Pt.2
{
    if(left>=right)
        return;
    int q=partition(a,left,right);
    quick_sort(a,left,q-1);
    quick_sort(a,q+1,right);
}
void down_adjust(int a[],int i,int n)//堆排序Pt.1
{
    int l=2*i,r=2*i+1;
    while(l<=n)
    {
        if(r<=n&&a[r]>a[l])
            l=r;
        if(a[i]<a[l])
        {
            int t=a[i];
            a[i]=a[l];
            a[l]=t;
        }
        i=l;l=2*i;r=2*i+1;
    }
}
void build_heap(int a[],int n)//堆排序Pt.2
{
    for(int i=n/2;i>=1;i--)
        down_adjust(a,i,n);
}
void heap_sort(int a[],int n)//堆排序Pt.3,数组序号从1开始
{
    build_heap(a,n);
    for(int i=n;i>=2;i--)
    {
        int t=a[1];
        a[1]=a[i];
        a[i]=t;
        down_adjust(a,1,i-1);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值