排序算法,操作次数最少

时间:2010-06-11 19:22:37

标签: wpf algorithm sorting performance hlsl

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

2 个答案:

答案 0 :(得分:4)

您要么使用插入排序或基数排序。以下是一些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;
    }
}

答案 1 :(得分:2)

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

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

Insertion Sort

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