短阵列的最佳排序功能

Swo*_*d22 5 c arrays sorting

我正在研究一种操纵图片的算法.基本上我将实现扩散(每个像素将获得8个周围像素的中值+它自己的值).

我要做的是用值创建一个包含9个整数的数组,对数组进行排序并获得数组[4]的中值.

我仍然不知道该问题使用什么,用于相对较小的数组的最佳排序函数是什么?排序功能大致称为x次,x是像素数.

Heapsort看起来有点矫枉过正.Quicksort表现不佳.而且我不想实现真正复杂的事情.

你们有什么感想?

ken*_*ytm 17

如果您只需要中位数,则根本不需要进行任何排序!(对于长数组,请参阅http://en.wikipedia.org/wiki/Selection_algorithm获取O(n)算法;当然,我们这里只讨论短数组).

对于9个数字的中位数,一点点的谷歌搜索揭示了文章快速中值搜索: N.Devillard 的ANSI C实现,它指出了JL Smith 在XC4000E FPGA中实现中值滤波器的文章,它提供了这种不言自明的"分类网络"使用19次比较获得中位数:

在此输入图像描述

就C而言:

typedef int T;

void sort2(T* a, T* b);
void sort3(T* a, T* b, T* c);
T min3(T a, T b, T c);
T max3(T a, T b, T c);

T median9(T p1, T p2, T p3, T p4, T p5, T p6, T p7, T p8, T p9)
{
    sort3(&p1, &p2, &p3);
    sort3(&p4, &p5, &p6);
    sort3(&p7, &p8, &p9);

    p7 = max3(p1, p4, p7);
    p3 = min3(p3, p6, p9);

    sort3(&p2, &p5, &p8);
    sort3(&p3, &p5, &p7);

    return p5;
}

void sort2(T* a, T* b)
{
    if (*a > *b)
    {
        T tmp = *b;
        *b = *a;
        *a = tmp;
    }
}

void sort3(T* a, T* b, T* c)
{
    sort2(b, c);
    sort2(a, b);
    sort2(b, c);
}

T min3(T a, T b, T c)
{
    if (a < b)
        return a < c ? a : c;
    else
        return b < c ? b : c;
}

T max3(T a, T b, T c)
{
    if (a > b)
        return a > c ? a : c;
    else
        return b > c ? b : c;
}
Run Code Online (Sandbox Code Playgroud)

编辑:此文件还包含获取3个,5个,6个,7个,9个和25个数字的中位数的代码.

#define PIX_SORT(a,b) { if ((a)>(b)) PIX_SWAP((a),(b)); }
#define PIX_SWAP(a,b) { pixelvalue temp=(a);(a)=(b);(b)=temp; }

/*----------------------------------------------------------------------------
   Function :   opt_med9()
   In       :   pointer to an array of 9 pixelvalues
   Out      :   a pixelvalue
   Job      :   optimized search of the median of 9 pixelvalues
   Notice   :   in theory, cannot go faster without assumptions on the
                signal.
                Formula from:
                XILINX XCELL magazine, vol. 23 by John L. Smith

                The input array is modified in the process
                The result array is guaranteed to contain the median
                value
                in middle position, but other elements are NOT sorted.
 ---------------------------------------------------------------------------*/

pixelvalue opt_med9(pixelvalue * p)
{
    PIX_SORT(p[1], p[2]) ; PIX_SORT(p[4], p[5]) ; PIX_SORT(p[7], p[8]) ;
    PIX_SORT(p[0], p[1]) ; PIX_SORT(p[3], p[4]) ; PIX_SORT(p[6], p[7]) ;
    PIX_SORT(p[1], p[2]) ; PIX_SORT(p[4], p[5]) ; PIX_SORT(p[7], p[8]) ;
    PIX_SORT(p[0], p[3]) ; PIX_SORT(p[5], p[8]) ; PIX_SORT(p[4], p[7]) ;
    PIX_SORT(p[3], p[6]) ; PIX_SORT(p[1], p[4]) ; PIX_SORT(p[2], p[5]) ;
    PIX_SORT(p[4], p[7]) ; PIX_SORT(p[4], p[2]) ; PIX_SORT(p[6], p[4]) ;
    PIX_SORT(p[4], p[2]) ; return(p[4]) ;
}
Run Code Online (Sandbox Code Playgroud)

  • +1.有人终于指出你不需要完整的排序.加上一些非常干净的代码. (3认同)