Увеличение количества проходов - PullRequest
0 голосов
/ 01 сентября 2011

Я хочу увеличить количество проходов, но вывод, который у меня есть, покажет неверный формат.Например, я ввел 5 цифр, например 5 4 3 2 1. Формат будет:

Пропуск 1: 1 4 3 2 5
Пропуск 2: 1 4 3 2 5
Пропуск 3:1 2 3 4 5
Пропуск 4: 1 2 3 4 5
Пропуск 5: 1 2 3 4 5

но мой токовый выход:

Пропуск 1: 2:3: 4: 5: 1 4 3 2 5
Пропуск 1: 2: 3: 4: 5: 1 4 3 2 5
Пропуск 1: 2: 3: 4: 5: 1 2 3 4 5
Пропуск 1: 2: 3: 4: 5: 1 2 3 4 5
Пропуск 1: 2: 3: 4: 5: 1 2 3 4 5

Я застрял сцикл заявления.Любые идеи, как я буду делать такой вывод.Я делаю быструю сортировку.

    int[] nums = new int[100];
    int SizeNum;
    bool isNum = false;

    private void ExeButton_Click(object sender, EventArgs e)
    {
            string SizeString = SizeTextBox.Text;
            isNum = Int32.TryParse(SizeString, out SizeNum);
            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();
            }
        }
    }

    public void q_sort(int left, int right)
    {
        int pivot, l_hold, r_hold;

        l_hold = left;
        r_hold = right;
        pivot = nums[left];

        while (left < right)
        {
            while ((nums[right] >= pivot) && (left < right))
            {
                right--;
            }

            if (left != right)
            {
                nums[left] = nums[right];
                left++;
            }

            while ((nums[left] <= pivot) && (left < right))
            {
                left++;
            }
            if (left != right)
            {
                nums[right] = nums[left];
                right--;
            }
        }
        nums[left] = pivot;
        pivot = left;
        left = l_hold;
        right = r_hold; 
        Display();
        if (left < pivot)
        {
            q_sort(left, pivot - 1);
        }
        if (right > pivot)
        {
            q_sort(pivot + 1, right);
        }
    }

    public void sortArray()
    {
        q_sort(0, SizeNum - 1);
    }

    public void Display()
    {
        int i;
        int x;
        String numbers = "";
        ResultText.AppendText("Pass ");
        for (x = 1; x < SizeNum; x++)
        {

            ResultText.AppendText(" " + x + ": ");

        }
        for (i = 0; i < SizeNum; i++)
        {
            numbers += nums[i].ToString() + " , ";
        }
        ResultText.AppendText(numbers + "\n");
    }

Ответы [ 4 ]

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

Самый простой способ - передать переменную отладки через функцию быстрой сортировки, чтобы отслеживать текущее состояние, например ::100100

public void q_sort(int left, int right, int currentPass)
{
    /* ... */

    Display(currentPass);

    /* ... */

    q_sort(left, pivot - 1, currentPass + 1);
    q_sort(pivot + 1, right, currentPass + 1);

    /* ... */
}

public void Display(int currentPass)
{
    ResultText.AppendText("Pass " + currentPass);

    // output the array contents as you currently do
}
0 голосов
/ 01 сентября 2011

Давайте посмотрим на первый цикл for:

for (x = 1; x < SizeNum; x++)
{
    ResultText.AppendText(" " + x + ": ");
}

Обратите внимание, что вы рассчитываете от 1 до SizeNum. Этот цикл добавляет каждое число к вашему результату, поэтому вы получаете Pass 1: 2: 3: 4: 5: в каждой строке. Если вы возьмете больший массив чисел, вы увидите, что результат отражает это. Например, если вы возьмете массив из 10 чисел, вы увидите Pass 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:, за которым следует массив.

Чтобы получить то, что вы ищете, вам нужно передать текущую итерацию своей функции, как уже указывалось в некоторых ответах, например:

private void Display(int pass)
    // initialise your other variables here
    ResultText.AppendText("Pass " + pass + ": ");

    // output your array as normal here
0 голосов
/ 01 сентября 2011

в верхней части вашего класса добавьте

int Pass=0;

, а затем в своей процедуре отображения замените

for (x = 1; x < SizeNum; x++)  
        {  

            ResultText.AppendText(" " + x + ": ");  

       } 

на

  ResultText.AppendFormat("{0}: ",Pass++);

Как выглядит ваш кодон может запускаться более одного раза, возможно, вы захотите сбросить Pass = 1 в SortArray ();

0 голосов
/ 01 сентября 2011

ваш SizeNum всегда равен 5, поэтому цикл на дисплее:

    for (x = 1; x < SizeNum; x++)
    {

        ResultText.AppendText(" " + x + ": ");

    }

всегда печатает 1-5Вам нужно как-то сообщить Display, сколько раз он был вызван, чтобы получить правильную метку.

...