Matrix Row - задача рекурсии QuickSort - PullRequest
1 голос
/ 06 января 2011

Я адаптировал метод быстрой сортировки для сортировки строки массива.Вот код:

Это работает отлично

static void QuickSort(int lowBound, int highBound, int[] a)
        {
            int temp = 0;
            int x = random.Next(lowBound, highBound);
            int pivot = a[x];
            int i = lowBound;
            int j = highBound;
            do 
            {
                while (a[i] < pivot) i++;
                while (pivot < a[j]) j--;
                if (i <= j)
                {
                    temp = a[i]; //changes an element smaller than the pivot...
                    a[i] = a[j];//... with the greater one
                    a[j] = temp;
                    i++; j--;
                }

            }
            while (i <= j);
            if (lowBound < j) { QuickSort(lowBound, j, a); }//recursion 
            if (i < highBound){ QuickSort(i,highBound, a); }
        }

Вот проблемный метод

static void QuickSortMatrix(int[,] a)
        {
            int n = a.GetLength(0);
            int m = a.GetLength(1);
            for (int i = 0; i < n; i++)
            {
                QuickSortRow(0, m - 1, i, a);
            }
            for (int j = 0; j < m; j++)
            {
                QuickSortRow(0, n - 1, j, a);
            }

        }
        static void QuickSortRow(int lowBound, int highBound, int row, int[,] a)
        {
            int temp = 0;            
            int x = random.Next(lowBound, highBound);
            int pivot = a[row,x];
            int p = lowBound;
            int q = highBound;
            do 
            {
                while (a[row,p] < pivot) p++;
                while (pivot < a[row,q]) q--;
                if (p <= q)
                {
                    temp = a[row,p];
                    a[row,p] = a[row,q];
                    a[row,q] = temp;
                    p++; q--;
                }

            }
            while (p <= q);
            if (lowBound < q)  { QuickSortRow(lowBound, q, row, a); }
            if (p < highBound) { QuickSortRow(p, highBound,row, a); }
        }

Сначала, когда выполняется цикл for, все в порядке, ноПо какой-то причине при рекурсивном выполнении строка, которая должна быть постоянной при вызове метода, выходит за границы матрицы.Вот мой массив и строки достигают значения 4

int[,] matrix = 
                {
                    {7,8,9,10,11,5},
                    {3,6,4,16,22,4},
                    {7,9,17,8,3,21},
                    {24,7,11,19,3,4}
                };

Надеюсь, мое объяснение было достаточно ясным.

Может кто-нибудь посоветовать мне?Что мне здесь не хватает?

Спасибо за вашу помощь!

BR Стефан

1 Ответ

1 голос
/ 06 января 2011

n - количество строк в матрице (4)

m - количество столбцов в матрице (6)

Во втором цикле вы идете 0..m и передаете это значение параметру строки. Он взрывается, потому что в матрице больше столбцов, чем строк. то есть он пытается прочитать матрицу [4, 0].

Примечание: насколько я могу судить, вам не нужен второй цикл, потому что ваши строки уже отсортированы после первого цикла. Удалите это, и оно не выдаст исключение.

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