1-11排序

11.1插入排序

isort1()

一般的插入排序

    m=x[0];

    for(i=1; i<MAX; i++)
    {
        for(j=i; j<0 && x[j]<x[j-1]; j--)
        {
            t=x[j],x[j]=x[i],x[i]=t;
        }

    }

isort2()

使用内联函数swap(),代替t=x[j],x[j]=x[i],x[i]=t; 实现加速。

isort3()

将内层循环的赋值操作移到外层

    for(i=1; i<MAX; i++)
    {
        m = x[i];
        for(j=i; j>0 && m<x[j-1]; j--)
        {
            x[j] = x[j-1];
        }
        x[j] = m;
    }

我测试的排序时间:

0.317s


11.2简单的快速排序

qsort1()

void myQsort(int *array, int l, int u)
{
    int i;
    int m;
    int t;
    if(l>=u)
    {
        return;
    }
    t = l;
    m = l;
    for(i=l+1; i<=u; i++)
    {
        if(array[i]<array[t])
        {
            m++;
            swap(&array[m],&array[i]);
        }
    }
    swap(&array[m],&array[t]);
    myQsort(array,l,m-1);
    myQsort(array,m+1,u);
}

我测试的排序时间:

0.012s


11.3更好的快速排序

双向划分法

问题:数组所有值相同情况下,运行时间为O(n平方)

isort3() 0.001s

qsort1() 0.635s


qsort2()
void myQsort2(int *array, int l, int u)
{
    if(l>=u)
        return;
    int t;
    int i,j;
    t = l;
    i = l+1;
    j = u;
    while(i<=j)
    {
        while(array[i]<array[t]) i++;
        while(array[j]>array[t]) j--;
        swap(&array[i],&array[j]);
        i++;
        j--;
    }
    swap(&array[t],&array[j]);
    myQsort2(array,l,j-1);
    myQsort2(array,j+1,u);
}

qsort2()测试时间:0.003s


随机选择划分元素

可以使用中值法,也可以使用取随机数组元素法。

swap(l,randint(l, u));


cutoff法

即当需排序的子数组长度小于一个较小的值cutoff时,

可以对其使用插入排序,插入排序对长度小的排序更高效。


展开循环体内的swap()函数

最终代码:


排序时间测试(带生成随机数的时间)

数组长度19999

0.314s

0.013s

0.004s


0.001s

0.642s

0.003s


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值