0

我写了一个小 C# 命令应用程序。应该使用堆排序算法对四个数组进行排序。我从一个网站上获取了一个算法,它运行得很好。现在我想计算算法对一个数组进行排序所需的键比较。我试图通过 for 循环计算比较,但它似乎是错误的......我必须计算它的任何想法?

这是我的排序算法方法。GlobalVar.CountVal只是一个public static int属性。

public static void HeapSort(int[] array, int arr_ubound)
{
    int i, j;
    int lChild, rChild, pNode, root, temp;

    root = (arr_ubound - 1) / 2;

    for (j = root; j >= 0; j--)
    {
        for (i = root; i >= 0; i--)
        {
            GlobalVar.CountVal += 1;
            lChild = (2*i)+1;
            rChild = (2*i)+2;

            if ((lChild <= arr_ubound) && (rChild <= arr_ubound))
            {
                if (array[rChild] >= array[lChild])
                    pNode = rChild;
                else
                    pNode = lChild;
            }
            else
            {
                if (rChild > arr_ubound)
                    pNode = lChild;
                else
                    pNode = rChild;
            }

            if (array[i] < array[pNode])
            {
                temp = array[i];
                array[i] = array[pNode];
                array[pNode] = temp;
            }
        }
    }

    temp = array[0];
    array[0] = array[arr_ubound];
    array[arr_ubound] = temp;
    return;
}

这是完整的代码: http: //pastebin.com/4Y0NQECP

4

1 回答 1

1

通过使用此比较器而不是比较运算符 ( >=and <),您可以正确计算比较。

public class CountingComparer<T> : Comparer<T>
{
    public int Count { get; private set; }
    IComparer<T> defaultComparer = Comparer<T>.Default;
    public override int Compare(T left, T right)
    {
        this.Count++;
        return defaultComparer.Compare(left, right);
    }
}

要使用这样的比较器,修改代码的方法如下:

x [op] y // becomes
comparer.Compare(x, y) [op] 0
// e.g.
if (array[rChild] >= array[lChild]) // becomes
if (comparer.Compare(array[rChild], array[lChild]) >= 0)

然后只需确保对堆排序中的每个比较都使用此比较器(但仅在该排序中)。完整的代码(正如我在 LINQPad 中运行的那样)位于http://pastebin.com/UXAQh9B3。我将您的方法从硬编码更改为通用方法,以便更轻松地确定需要使用比较器的位置。

您的数据的比较计数如下:

1 - 652
2 - 652
3 - 0
4 - 155
于 2013-11-12T20:58:04.383 回答