Проблема сортировки кучи - PullRequest
       4

Проблема сортировки кучи

1 голос
/ 04 сентября 2011

Я сейчас работаю над сортировкой кучи.Коды, которые у меня пока есть, имеют неправильный вывод.Например, я ввел 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 ]

1 голос
/ 04 сентября 2011

В этой строке есть одна проблема:

if (SizeNum == numsInString.Length)

Поскольку SizeNum поле не инициализировано, его значение является значением по умолчанию, т. Е. 0.
Поэтому при вставке "5 4 3 2 1", numsInString.Length становится равным 5, и тогда код в этом if не достигается.
На самом деле, если вы установите SizeNum = numsInString.Length, ваш код, похоже, будет работать.

В любом случае, как указанодругие пользователи, если вы используете IDE, например Visual Studio или Sharp-Develop, вы должны использовать отладчик, который действительно очень полезен для поиска проблем с кодом.

Вот инструкции для Visual Studio: http://msdn.microsoft.com/en-us/library/sc65sadd.aspx

0 голосов
/ 19 марта 2014

Первый цикл for SortArray должен быть

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

Это строит вашу кучу.Вы начинаете со второго до последнего слоя дочерних элементов и перемещаетесь полностью к верхнему узлу дерева.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...