貌似桶排序的快速排序—线性时间

   我们假设要对一个数组进行排序,排序的key值为32位整数类型。那么可以使用快速排序对数组进行排序,但快速排序虽然简单易用,但它的平均情况和最坏情况复杂度是不同的。平均情况下,快速排序的时间复杂度为O(nlogn),空间复杂度为O(logn)【分配给递归调用时的堆空间】;最坏情况下,快速排序的时间复杂度为O(n2),空间复杂度为O(n)。但如果要排序的是整型key值,就可以利用桶排序对其按位分配,使其时间复杂度保证为O(n),空间复杂度为O(1)。

    光解释难以清除,一看代码便清楚了。

void qsort_bucket(int s[], int n)
{
    qsort_bucket_inner(s, 0, n-1, 31);
}


void qsort_bucket_inner(int s[], int low, int up, int bit_level)
{
    int m, i;
    int bit_value, tmp;
    if(low >= up || bit_level < 0) return;

    bit_value = 1<<bit_level;
    m = low-1;
    for(i=low; i<=high; i++){
        if((s[i] & bit_value) == 0){
            tmp = s[i];
            s[i] = s[++m];
            s[m] = tmp;
        }
    }
    qsort_bucket_inner(s, low, m, bit_level-1);
    qsort_bucket_inner(s, m+1, up, bit_level-1);
}

    这段代码排序的时间复杂度为O(32n) = O(n),空间复杂度为O(32) = O(1)。虽然只适用于以整型线索排序的情况,但简单实用,

可以适用于各种情况,不会有特别坏的情况出现。这段代码还可以用两边互换的方法优化,只是会复杂一点。

    它是参照了桶排序的情况,只是如果从位0增加到位31,用快排的方式肯定失败了,而从位31到位0,则恰好可以。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值