排序

1,冒泡排序:重复扫,然后将顺序相反的换回来。 时间复杂度为n^2,空间复杂度为n。

int temp=right;
for(int i=left;i<right;i++)
    for(int j=left;j<temp;j++)
        if(a[j]>a[j+1])  swap(a[j],a[j+1]);

2.快速排序:将其中一个元素作为基准,将无序子集分为两个区间,左半区的元素不大于基准,右半区的元素不小于基准。相当于每次确定一个元素的位置,然后二分求解。

void quicksort(int l,int r)
{
    if(l<r){
    int i=l,j=r;
    int temp=a[l];
    while(i<j){
        while(a[j]>=temp&&j>i) j--;
        if(j>i) a[i]=a[j];
        while(a[i]<=temp&&i<j) i++;
        if(i<j) a[i]=a[j];
    }
    a[i]=temp;
    quicksort(l-1,i);
    quicksort(i+1,r);
    }
}

3.归并排序:分治法,将大区间分为有序小区间,然后将有序小区间按分离倒序合并为有序大区间。

void hb(int left,int mid,int right)
{
    int i=left,j=mid+1,h=left;
    while(i<=mid&&j<=right)
    {
        if(a[i]<=a[j]) b[h++]=a[i++];
        else if(a[j]<a[i]) b[h++]=a[j++];
    }
    if(i<=mid) for(int k=i;k<=mid;k++) b[h++]=a[k];
    else for(int k=j;k<=right;k++) b[h++]=a[k];
    for(int g=left;g<=right;g++) a[g]=b[g];
}
void hbsort(int left,int right)
{
    if(left<right)
    {
        int mid=(left+right)/2;
        hbsort(left,mid);
        hbsort(mid+1,right);
        hb(left,mid,right);
    }
}

4.基数排序:(非负数排序)将数从低位到高位排。先按照个位数排序,然后按照十位数排然后。。。

void jssort(int n)//非负数排序
{
    int flag=1,base=1;
    queue <int> q[10];
    while(flag)
    {
        for(int i=0;i<n;i++)
        {
            int g=a[i]/base%10;
            q[g].push(a[i]);
        }
        flag=0;
        int h=0;
        base*=10;
        for(int i=0;i<10;i++)
        {
            while(!q[i].empty())
            {
                a[h++]=q[i].front();
                q[i].pop();
                if(flag==0&&a[h-1]/base!=0) flag=1;
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值