Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Java > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 21.09.2018, 13:07   #1
Fillimon
Пользователь
 
Регистрация: 16.04.2018
Сообщений: 13
Репутация: 10
По умолчанию Помогите найти ошибку (сортировка 2-мерного массива вставками)

Здравствуйте. Решил самостоятельно освоить Java и пока делаю только первые шаги. Чтобы сильнее вникнуть в язык, мне посоветовали попробовать реализовать сортировку вставками над 2-мерным массивом.

Я заполнил массив случайными значениями, и написал сам алгоритм, долго ломал голову над индексами массива, но думал что справился, однако при тестах выявилось, что почему-то сортируются не все числа. То тут то там выскакивают самозванцы, помогите найти ошибку! (код с комментариями приложен ниже)

Код:

   A = new int[n][n]; //матрица А размера n*n

    boolean flag;        //переменная выхода из циклов
    for(int i = 0; i < n; i++) {
        for (int j = 0; j < n; j ++) {
            flag = false;     //ставим начальное значение переменной выхода
            int currentNumber = A[i][j];   //сохраняем значение следующего элемента матрицы во вспомогательной переменной
            for(int k = 0; k <= i; k++){                 //пробегаем по всем предыдущим
                for (int l = 0; l<= j; l++){             //элементам матрицы и
                    if (currentNumber > A[k][l]){        //сравниваем с "currentNumber"
                        int m = i;           //Затем, заводим 4 вспомогательные переменные, где
                        int s = j;           // "m" и "s" индексы "предыдущего элемента матрицы",
                        int iI = i;          //  а "iI" и "jJ" индексы "текущего"
                        int jJ = j;          //  ( i и j - индексы нашего currentNumber )
                        while(A[k][l] != currentNumber){   //пока элемент оказавшийся меньше currentNumber
                                                                         // не станет равен ему повторяем:
                            if ((s == 0)&&(m != 0)) {m--; s = n-1;}    //т.к. массив двумерный делаем так,
                            else s--;                //чтобы при уменьшении индексации не выходило за пределы массива.
                            A[iI][jJ]=A[m][s];      //таким образом "следующему" элементу даём значение "предыдущего"
                            iI = m;                 //переназначаем переменные "предыдущего" элемента на "текущий"
                            jJ = s;
                            if ((k == m)&&(s == l)) { //и если мы переместили уже то число, чтобыло меньше, чем currentNumber
                                A[k][l] = currentNumber;  //присваиваем элементу значение currentNumber
                                flag = true;    //устанавливаем флаг выхода,
                                // чтобы не переписывать остальные отсортированные элементы
                            }
                        }
                    }
                    if(flag) break;   //закрываем вложенные циклы
                }
                if(flag) break;  //и если мы прошли ещё не всю матрицу, возвращаемся в первые 2 цикла
            }
        }
    }

Fillimon вне форума   Ответить с цитированием
Старый 21.09.2018, 13:16   #2
p51x
Профессионал
 
Регистрация: 15.02.2010
Сообщений: 12,755
Репутация: 2126
По умолчанию

Начнем с простых вопросов: что такое сортировка двумерного массива? какой на ни порядок?
__________________
Запомните раз и навсегда: помочь != "решите за меня"!
p51x на форуме   Ответить с цитированием
Старый 21.09.2018, 13:57   #3
Fillimon
Пользователь
 
Регистрация: 16.04.2018
Сообщений: 13
Репутация: 10
По умолчанию

Ах да, забыл))) Сортировка элементов массива по убыванию. От элемента массива А[0][0], А[0][1] и т.д. до A[n][n], где в A[0][0] находится самое большое число, а в A[n][n] самое маленькое
Fillimon вне форума   Ответить с цитированием
Старый 23.09.2018, 12:59   #4
Fillimon
Пользователь
 
Регистрация: 16.04.2018
Сообщений: 13
Репутация: 10
По умолчанию

Всем спасибо за помощь, вы были очень отзывчивы, всё починил, только благодаря вашим советам, вот рабочий код программы.
"Сортировка двумерного массива вставками по не возрастанию"
Код:

    int help = 0;
    boolean flag;
    for(int i = 0; i < n; i++) {
        for (int j = 0; j < n; j ++) {
            flag = false;
            int currentNumber = A[i][j];
            for(int k = 0; k <= i; k++){
                for (int l = 0; l<= help; l++){
                    if (k == i) help = j;
                    else help = n-1;
                    if (currentNumber > A[k][l]){
                        int m = i;
                        int s = j;
                        int iI = i;
                        int jJ = j;
                        while(A[k][l] != currentNumber){
                            if ((s == 0)&&(m != 0)) {m--; s = n-1;}
                            else s--;
                            A[iI][jJ]=A[m][s];
                            iI = m;
                            jJ = s;
                            if ((k == m)&&(s == l)) {
                                A[k][l] = currentNumber;
                                flag = true;
                            }
                        }
                    }
                    if(flag) break;
                }
                if(flag) break;
            }
        }
    }

Fillimon вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка двумерного массива. Не могу найти ошибку Annushka19 Общие вопросы по Java, Java SE, Kotlin 1 06.11.2013 22:51
Сортировка одномерного массива. Паскаль. Не найти ошибку, Буду благодарна) ТатьянаЧернышева Помощь студентам 2 01.12.2011 22:06
Сортировка массива простыми вставками на Delphi Алексей777911 Помощь студентам 3 21.04.2010 18:31
Сортировка вставками двухмерного массива ponchikpk Помощь студентам 6 09.03.2009 14:34
Сортировка строк 2-мерного массива Mayday_007 Помощь студентам 1 04.04.2008 09:26


15:51.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru