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

  • Post author:
  • Post category:其他



我们假设要对一个数组进行排序,排序的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,则恰好可以。



版权声明:本文为qb_2008原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。