【问题标题】:Sort algorithm with fewest number of operations运算次数最少的排序算法
【发布时间】:2011-03-02 19:44:09
【问题描述】:

运算次数最少的排序算法是什么?我需要在 HLSL 中实现它作为 WPF 的像素着色器效果 v2.0 的一部分,因此考虑到像素着色器的限制,它需要进行非常少量的操作。我需要对 9 个值进行排序,特别是当前像素及其邻居。

【问题讨论】:

    标签: wpf algorithm sorting performance hlsl


    【解决方案1】:

    您要使用插入排序或基数排序。以下是一些 C++ 实现:

    基数排序

    void radix (int byte, long N, long *source, long *dest)
    {
      long count[256];
      long index[256];
      memset (count, 0, sizeof (count));
      for ( int i=0; i<N; i++ )
        count[((source[i])>>(byte*8))&0xff]++;
    
      index[0]=0;
      for ( i=1; i<256; i++ )
        index[i]=index[i-1]+count[i-1];
      for ( i=0; i<N; i++ )
        dest[index[((source[i])>>(byte*8))&0xff]++] = source[i];
    }
    

    您需要调用radix() 四次,因为它只适用于一个列。

    插入排序

    void insertSort(int a[], int length)
    {    
        int i, j, value;
        for(i = 1; i < length; i++)
        {
            value = a[i];
            for (j = i - 1; j >= 0 && a[j] > value; j--)
                a[j + 1] = a[j];
            a[j + 1] = value;
        }
    }
    

    【讨论】:

      【解决方案2】:

      Knuth 在寻找最佳排序算法方面做了一些工作。然而,即使只有五个元素,比较次数最少的算法也是very complicated to implement

      我建议不要尝试找到最佳算法,而是尝试找到一种易于实现且足以满足您的需求的算法。如果您可以访问标准排序算法,请先尝试使用该算法。如果没有,那么您可以使用插入排序或合并排序来保持简单,看看这是否适合您。

      Insertion Sort:

      • 简单的实现
      • 对(相当)小型数据集非常有效
      • 自适应,即对已经充分排序的数据集有效:时间复杂度为 O(n + d),其中 d 是反转次数
      • 在实践中比大多数其他简单的二次算法更有效,即 O(n2) 算法,例如选择排序或冒泡排序;最好的情况(接近排序的输入)是 O(n)
      • 稳定,即不改变具有相等键的元素的相对顺序
      • 就地,即只需要固定数量的 O(1) 额外内存空间
      • 在线,即可以在收到列表时对其进行排序。

      【讨论】:

      • 我必须把它压缩到最小,除了排序之外,我在着色器中还有一些其他的事情要做,所有这些都需要指令......
      • @luvieere:所以你的意思是你需要最小化代码大小,而不是运行时执行的操作数?那么你肯定不想要我上面链接的算法。反之亦然。不过,插入排序可能对您来说是完美的。这是 O(n^2) 但由于 n 很小,这可能不是问题。它也很容易实现。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-16
      • 2020-09-23
      • 1970-01-01
      • 2018-10-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多