Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Сортировка


Автор: NEt_Hunter 9.11.2007, 21:18
Код сортировки чисел выдает ошибку, прошу помочь найти  ошибку. 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] );
  }
}

Автор: drHip 9.11.2007, 21:52
это самый простой и самый медленный пузырек
Код

        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]);

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

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

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

Автор: 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;
            }
        }
    }
}



Добавлено через 54 секунды
Ого уже ответов сколько ))

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

Автор: Dims 9.11.2007, 23:21
Цитата(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, надо во всех случаях идти дальше, но не до самого конца, на каждый раз на единицу меньше.

Автор: jManiak 10.11.2007, 06:56
Цитата(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

Автор: NEt_Hunter 10.11.2007, 13:22
Спасибо большое всем за советы!
Я не пользовался пузырьковым методом в этом примере. Просто сортировка.
Цитата(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) лучше не используй метки, это не есть  хорошо. 

Это почему? Вдруг мне придется выйти с внешнего цикла или попасть в определенную строку кода проги?

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


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

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

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

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

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

Автор: Dims 11.11.2007, 01:02
Цитата(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 именно по этой причине.

Автор: NEt_Hunter 11.11.2007, 23:11
Цитата(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 внешних цикла решено!
 Да, переход в любое место грубо сказал. Цикл, конечно, имел ввиду.

Автор: Dims 11.11.2007, 23:40
У тебя (по первому тексту) внутренний цикл идёт до первой перестановки и потом прерывается. Поэтому, на каждый внешний цикл будет выполняться только одна перестановка. 

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

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

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

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

Автор: iluvatar 12.11.2007, 16:30
  Про операторы перехода очень много говорили люди намного у мнее нас с вами. Лично я прислушиваюсь к авторитетному мнению и считаю, что такую логику можно ипсользовать ТОЛЬКО в исключительных случаях. 
  
NEt_Hunter, 
Имей в виду, что в Java очень редко применяется сортировка руками. Классам можно определить метод compareTo для сравнения 2-х объектов и использовать встроенные методы сортировок.

Автор: Platon 12.11.2007, 18:54
А мне вот интересно, если метки в Java - дурной тон, то зачем тогда их вообще ввели в Java?
Ведь простые процедуры в Java писать нельзя, хотя к процедурам куда меньше претензий, чем к меткам.

Автор: Kangaroo 12.11.2007, 19:16
Цитата(Platon @  12.11.2007,  17:54 Найти цитируемый пост)
А мне вот интересно, если метки в Java - дурной тон, то зачем тогда их вообще ввели в Java?

Метки нужны там, где они реально могут упростить жизнь программисту(например без них код получиться в пару раз больше  smile ). Есть определенны ситуации где они помогают.
Тем более в Java'e устранены некоторые недостатки меток благодаря тому, что они используются не с goto, а с break и continue.

Автор: Dims 12.11.2007, 21:26
Цитата(nornad @  12.11.2007,  08:17 Найти цитируемый пост)
То, что это "считается дурным тоном" и "мыслишь не по-джавному" - это не причины, а лишь объяснения. Причину же объяснили немного ранее - код получается менее очевидным. 


Ну, можно, наверное, здесь проводить разграничение, но я не уверен. Язык -- это ведь и есть "средство для придания очевидности", соответственно, любое нарушение правил или рекомендаций языка, естественно, ведут к уменьшению очевидности.

Добавлено через 2 минуты и 52 секунды
Цитата(Platon @  12.11.2007,  18:54 Найти цитируемый пост)
А мне вот интересно, если метки в Java - дурной тон, то зачем тогда их вообще ввели в Java?

Потому что мир не настолько совершенен, как Java smile

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

В качестве примера можно привести такие языки, как php или perl, в которых вообще намешано куча всего, и которые одновременно интенсивно используются.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)