Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сортировка, Где ошибка? 
V
    Опции темы
NEt_Hunter
Дата 9.11.2007, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 106
Регистрация: 9.10.2006
Где: Германия

Репутация: нет
Всего: нет



Код сортировки чисел выдает ошибку, прошу помочь найти  ошибку. Java тока начал изучать.
Код

public class Puzir
{
  public static void main (String [] args)
  {
    int num [] = { 5, 4, 3, 2, 1};
    for (int i = 0; i < 5; i++)
    {
      second:    
      for (int j = 0; j < 5; j++)
      {
        if(num[j] <= num[j+1])
          break second;
        else 
          num[j] = num[j+1]; 
      }
    }
    System.out.println( "massiv = " + num[0] );
  }
}

PM MAIL ICQ   Вверх
drHip
Дата 9.11.2007, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 30.5.2007

Репутация: нет
Всего: нет



это самый простой и самый медленный пузырек
Код

        int num [] = { 5, 4, 3, 2, 1};
        for (int i=0;i<num.length; i++)
            for (int j=0; j<num.length; j++)
            {
                if (num[j]>num[i])
                {
                    int tmp = num[j];
                    num[j] = num[i];
                    num[i] = tmp;
                }
            }

        for (int i=0;i<num.length; i++)
            System.out.println(num[i]);

PM MAIL   Вверх
Kangaroo
Дата 9.11.2007, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

Репутация: 21
Всего: 104



NEt_Hunter, 
1) код нужно писать в теге code, будет удобней читать.
2) ошибка у тебя на этой строке:
Код

if (num[j] <= num[j+1]) {

потому что условие цикла у тебя j < 5 и когда j становится 4, то j+1 равняется 5, а максимальный индекс массива 4. Вот и вылетает ошибка выхода за пределы массива.
3) лучше не используй метки, это не есть  хорошо.


--------------------
Lost....
PM MAIL MSN   Вверх
Samotnik
Дата 9.11.2007, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 8
Всего: 191



Метод пузырька  smile 
Код

void bubbleSort(int array[], int col){                    
    int temp=0;                              
    for (int i=1;  i<col  ;  i++){            
        for (int j=0;  j<col-i;  j++){     
            if (array [j]>array [j+1]){     
                temp=array[j];           
                array [j]=array [j+1];    
                array [j+1]=temp;
            }
        }
    }
}



Добавлено через 54 секунды
Ого уже ответов сколько ))
PM MAIL   Вверх
Kangaroo
Дата 9.11.2007, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

Репутация: 21
Всего: 104



Что ж вы все пузырьки кидаете  smile  человек изучает Java'y, а не сортирует числа ))) ему ошибку надо было помочь найти.


--------------------
Lost....
PM MAIL MSN   Вверх
Dims
Дата 9.11.2007, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 4
Всего: 11



Цитата(NEt_Hunter @  9.11.2007,  21:18 Найти цитируемый пост)
од сортировки чисел выдает ошибку, прошу помочь найти  ошибку.

Почему выдаёт ошибку -- уже объяснили.
Для исправления нужно внутренний цикл сделать до 4, а не до 5.

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

Поэтому, надо сделать обмен через временную переменную.

Например вместо

Код

else num[j] = num[j+1]; 


вот так

Код

else {
   tem = num[j];
   num[j] = num[j+1]; 
   num[j+1] = temp;
}


Кроме того, есть синтаксическая погрешность: в твоём случае не нужен break <метка>. Если ты хочешь выйти только из внутреннего цикла. Но именно это делает простой break без метки. Поэтому, можно убрать метку.

Наконец, я не совсем понимаю алгоритм. Твой алгоритм, по сути, делает только 5 перестановок. Хватит ли их для сортировки? Мне кажется, нет. И это точно не метод пузырька.

По методу пузырька не надо делать break, надо во всех случаях идти дальше, но не до самого конца, на каждый раз на единицу меньше.
PM MAIL   Вверх
jManiak
Дата 10.11.2007, 06:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 6.2.2007
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Цитата(NEt_Hunter @  9.11.2007,  21:18 Найти цитируемый пост)
second:    for (int j = 0; j < 5; j++)     {       if (num[j] <= num[j+1]) {       break second; }

Брр... NEt_Hunter, отвыкай от бейсика и от меток вообще. smile
PM MAIL ICQ   Вверх
NEt_Hunter
Дата 10.11.2007, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 106
Регистрация: 9.10.2006
Где: Германия

Репутация: нет
Всего: нет



Спасибо большое всем за советы!
Я не пользовался пузырьковым методом в этом примере. Просто сортировка.
Цитата(Samotnik @  9.11.2007,  22:04 Найти цитируемый пост)
Метод пузырька  smile 

void bubbleSort(int array[], int col){                    
    int temp=0;                              
    for (int i=1;  i<col  ;  i++){            
        for (int j=0;  j<col-i;  j++){     
            if (array [j]>array [j+1]){     
                temp=array[j];           
                array [j]=array [j+1];    
                array [j+1]=temp;
            }
        }
    }
}


Знаком сним уже с С++ smile


Цитата(Dims @  9.11.2007,  23:21 Найти цитируемый пост)
Наконец, я не совсем понимаю алгоритм. Твой алгоритм, по сути, делает только 5 перестановок. Хватит ли их для сортировки? Мне кажется, нет. И это точно не метод пузырька.

Должно хватить, ведь чисел 5 и перестановок 5. Для n-го количества можно ведь использовать  num.length


Цитата(jManiak @  10.11.2007,  06:56 Найти цитируемый пост)
Брр... NEt_Hunter, отвыкай от бейсика и от меток вообще. smile 

С бейзиком вообще не знаком.


Цитата(Dims @  9.11.2007,  23:21 Найти цитируемый пост)


Кроме того, есть синтаксическая погрешность: в твоём случае не нужен break <метка>. Если ты хочешь выйти только из внутреннего цикла. Но именно это делает простой break без метки. Поэтому, можно убрать метку.

Знаю, можно. Я ведь говорил, что тока учусь, пробую всевозможные варианты, тем самым закрепляю уроки с метками.

Цитата(Kangaroo @  9.11.2007,  21:52 Найти цитируемый пост)
3) лучше не используй метки, это не есть  хорошо. 

Это почему? Вдруг мне придется выйти с внешнего цикла или попасть в определенную строку кода проги?
PM MAIL ICQ   Вверх
Kangaroo
Дата 10.11.2007, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

Репутация: 21
Всего: 104



Цитата(NEt_Hunter @  10.11.2007,  12:22 Найти цитируемый пост)
Это почему? Вдруг мне придется выйти с внешнего цикла или попасть в определенную строку кода проги? 


Ну вот представь. Вот понаставлял ты таких меток. А потом кто-нибудь другой (или ты сам через некоторое время) попытается разобраться в твоем коде. Это хорошо когда просто алгоритм. А если код будет побольше и несколько меток? Запутаться можно элементарно. Такие проги умные люди сравнивают с макаронами )) (вроде так).
Метки нужно использовать только в крайних случаях, когда они реально упростят жизнь.


--------------------
Lost....
PM MAIL MSN   Вверх
serger
Дата 10.11.2007, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 19.6.2007
Где: Ижевск

Репутация: 1
Всего: 5



Цитата(NEt_Hunter @ 10.11.2007,  13:22)
Это почему? Вдруг мне придется выйти с внешнего цикла или попасть в определенную строку кода проги?

Метки желательно использовать только если ... я даже не могу придумать когда, тк сам ниразу не использовал и даже не думал о этом..
Почитай какую нить умную книжку, там найдёшь подробный ответ на этот вопрос. И приводятся правильные примеры, где метки нужны.

Хотя для прерывания циклов обычно используется сразу return. И старайся избегать длинных методов. Каждый метод должен делать что-то элементарное и одно.

И не изучай Java на реализации алгоритмов. Не к чему это. Основные алгоритмы реализованы. Не зачем городить велосипед, поэтому врятли это реально понадобиться.
Лучше изучай ООП, UML, шаблоны, учись правильно строить приложения. Это реально необходимо и важно.


--------------------
упс!
PM MAIL WWW Skype GTalk Jabber   Вверх
Dims
Дата 11.11.2007, 01:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 4
Всего: 11



Цитата(NEt_Hunter @  10.11.2007,  13:22 Найти цитируемый пост)
Должно хватить, ведь чисел 5 и перестановок 5. Для n-го количества можно ведь использовать  num.length

Я думаю, что перестановок надо больше пяти.

Смотри

0) 54321
1) 45321
2) 43521
3) 34521
4) 34251
5) 32451

Видишь? Ещё не отсортировалось.

Цитата(NEt_Hunter @  10.11.2007,  13:22 Найти цитируемый пост)
тем самым закрепляю уроки с метками.

Считается, что использовать метки в Java -- "дурной тон". Иначе говоря, если тебе приходится использовать метки, то ты мыслишь не по-джавному, а применяешь навыки из других языков программирования.

Цитата(NEt_Hunter @  10.11.2007,  13:22 Найти цитируемый пост)
попасть в определенную строку кода проги? 

В Java это вообще невозможно. Ты не можешь попасть в любую строчку программы, пометив её меткой, так как оператора goto нет. Ты можешь пометить блок меткой и потом с помощью break <метка> перейти на КОНЕЦ этого блока (но не на метку!). Ты можешь пометить ЦИКЛ меткой и с помощью continue <метка> перейти на начало цикла. Но это обязательно должен быть цикл, просто так в любое место не перейдёшь.

Разработчики Java специально устранили "лишние" возможности, чтобы легче было программировать. Меньше возможностей, меньше вариантов, меньше ошибок, проще думать. Очень многие вещи, которые есть в Си++ или Бейсике отсутствуют в Java именно по этой причине.

PM MAIL   Вверх
NEt_Hunter
Дата 11.11.2007, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 106
Регистрация: 9.10.2006
Где: Германия

Репутация: нет
Всего: нет



Цитата(Dims @  11.11.2007,  01:02 Найти цитируемый пост)
Я думаю, что перестановок надо больше пяти.

Смотри

0) 54321
1) 45321
2) 43521
3) 34521
4) 34251
5) 32451
Видишь? Ещё не отсортировалось.


Получается!
1)
45321
43521
43251
43215


2)
34215
32415
32145
32145

3)
23145
21345
21345
21345

4)
12345
Всего за 4 внешних цикла решено!
 Да, переход в любое место грубо сказал. Цикл, конечно, имел ввиду.

Это сообщение отредактировал(а) NEt_Hunter - 11.11.2007, 23:15
PM MAIL ICQ   Вверх
Dims
Дата 11.11.2007, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 4
Всего: 11



У тебя (по первому тексту) внутренний цикл идёт до первой перестановки и потом прерывается. Поэтому, на каждый внешний цикл будет выполняться только одна перестановка. 
PM MAIL   Вверх
nornad
Дата 12.11.2007, 08:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 16
Всего: 31



Цитата(Dims @  11.11.2007,  04:02 Найти цитируемый пост)
Считается, что использовать метки в Java -- "дурной тон". Иначе говоря, если тебе приходится использовать метки, то ты мыслишь не по-джавному, а применяешь навыки из других языков программирования.

Ну, вообще-то, это не причина не использовать метки. То, что это "считается дурным тоном" и "мыслишь не по-джавному" - это не причины, а лишь объяснения.
Причину же объяснили немного ранее - код получается менее очевидным. Даже одной метки хватит, чтобы запутать читающего. Всего лишь требуется, чтобы при листании бряк и его метка оказались на разных страницах.
Кстати, с/с++ точно так же не одобряет метки.  smile 

Цитата(NEt_Hunter @  12.11.2007,  02:11 Найти цитируемый пост)
Всего за 4 внешних цикла решено!

Интересно, и почему это не пузырёк? Очень даже пузырёк. Классический. smile
Только реализован не до конца, как уже говорили. smile


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
iluvatar
Дата 12.11.2007, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 266
Регистрация: 17.9.2007

Репутация: нет
Всего: 4



  Про операторы перехода очень много говорили люди намного у мнее нас с вами. Лично я прислушиваюсь к авторитетному мнению и считаю, что такую логику можно ипсользовать ТОЛЬКО в исключительных случаях. 
  
NEt_Hunter, 
Имей в виду, что в Java очень редко применяется сортировка руками. Классам можно определить метод compareTo для сравнения 2-х объектов и использовать встроенные методы сортировок.
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0610 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.