堆排序问题

时间:2011-09-04 15:23:39

标签: c# algorithm sorting heap

我现在正在堆排序。到目前为止,我的代码输出错误。例如,我输入了4 3 5 2 1,我输入的第一个数字始终位于最后一个索引上。输出将是1 2 3 5 4.任何想法我的代码有什么问题。

    int[] nums = new int[100];
    int SizeNum;
    int x;
    int currentPass;
    int nPass = 1;

    private void ExeButton_Click(object sender, EventArgs e)
    {
            nPass = 1;
            string[] numsInString = EntNum.Text.Split(' ');   //split values in textbox
            for (int j = 0; j < numsInString.Length; j++)
            {
                nums[j] = int.Parse(numsInString[j]);
            }
            if (SizeNum == numsInString.Length)
            {
                SortArray(currentPass);
                ResultText.AppendText("\n\n");
            }
        }
    }

    public void SortArray(int currentPass)
    {
        int i;
        int temp;
        for (i = (SizeNum / 2) - 1; i >= SizeNum; i--)
            {
                siftDown(i, x, currentPass + 1);
            }

            for (i = SizeNum - 1; i >= 1; i--)
            {
                temp = nums[0];
                nums[0] = nums[i];
                nums[i] = temp;
                siftDown(0, i - 1, currentPass + 1);
                Display(currentPass);
            }
            Display(currentPass); 
        }        

    public void siftDown(int root, int bottom, int currentPass)
    {
        bool done = false;
        int maxChild;
        int temp;

        while ((root * 2 <= bottom) && (!done))
        {
            if (root * 2 == bottom)
                maxChild = root * 2;
            else if (nums[root * 2] > nums[root * 2 + 1])
                maxChild = root * 2;
            else
                maxChild = root * 2 + 1;
            Display(currentPass);
            if (nums[root] < nums[maxChild])
            {
                temp = nums[root];
                nums[root] = nums[maxChild];
                nums[maxChild] = temp;
                root = maxChild;
            }                
            else
            {
                done = true;
            }             
        }
        Display(currentPass);
    }

    public void Display(int currentPass)
    {
        int i;
        String numbers = "";
        ResultText.AppendText("Pass " + nPass + ":    ");
        for (i = 0; i < SizeNum; i++)
        numbers += nums[i].ToString() + " , ";
        ResultText.AppendText(numbers + "\n");
        nPass++;
    }

2 个答案:

答案 0 :(得分:1)

这一行存在一个问题:

if (SizeNum == numsInString.Length)

由于SizeNum字段未初始化,其值为默认值,即0 因此,当您插入"5 4 3 2 1"时,numsInString.Length等于5,然后未达到if中的代码。
事实上,如果你设置SizeNum = numsInString.Length,你的代码似乎有效。

无论如何,正如其他用户所指出的,如果您使用的是像visual studio或sharp-develop这样的IDE,那么您应该使用真正有助于查找代码问题的调试器。

以下是Visual Studio的操作方法:http://msdn.microsoft.com/en-us/library/sc65sadd.aspx

答案 1 :(得分:0)

SortArray的第一个for循环应该是

for (i = (SizeNum / 2) - 1; i >= 0; i--)

这正在构建你的堆。您从第二层到最后一层子项开始,一直移动到树的顶部节点。