Модераторы: bsa
  

Поиск:

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


Новичок



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

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



Привет. Осваиваю сортировку массивов.Остановился на сортировке выбором. Сначала искал инфу по ней, вроде нашел. Набросал код(ниже), но что-то оно выводит в том-же порядке как я и ввёл массив.. Помогите пож-ста, что не так?
И если можно, как я код для новичка оформляю.Можно неск. советов.
Спасибо.
С Ув. Игорь.


Код

#include <stdio.h>
#include <conio.h>

int main ()
{
    const int N = 10;
    int B,i,j,k;
    int A[N];
    printf("Vvod massiva: \n");
    for (i = 0; i < N; i++)
    {
        printf("A[%d]=\a",i);
        scanf("%d",&A[i]);
    }
    for ( i = 1; i < N; i++)
    {
        B = A[i];
    for  (j = 0; j < i; j++)
        if (B < A[j])
        {
            for (k = i - 1; k < j; k--)
                A[k + 1] = A[k];
        }

        A[i] = B;
    }
    printf("Sort Massiv: ");
    for (i = 0; i < N; i++)
    printf("%d ",A[i]);
    getch();
    return 0;
}




Это сообщение отредактировал(а) papochka - 11.1.2010, 18:18
PM MAIL   Вверх
bsa
Дата 11.1.2010, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



в строке 21 попробуй поставить условие k <= j
в строке 25 i замени на j
PM   Вверх
toxx
Дата 11.1.2010, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Маленько переделал...
Код

#include <stdio.h>
#include <conio.h>
int main ()
{
    const int N = 10;
    int B,i,j,k;
    int A[N],buf;
    printf("Vvod massiva: \n");
    for (i = 0; i < N; i++)
    {
        printf("A[%d]=\a",i);
        scanf("%d",&A[i]);
    }
    for ( i = 0; i < N-1; i++)
    {
    for  (j = i+1; j<N; j++)
        if (A[i] < A[j])
        {
            buf=A[i];
            A[i]=A[j];
            A[j]=buf;
        }
    }
    printf("Sort Massiv: ");
    for (i = 0; i < N; i++)
    printf("%d ",A[i]);
    getch();
    return 0;
}

PM MAIL   Вверх
comcon1
Дата 11.1.2010, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

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



хихи, чувак, ты не маленько переделал. Ты превратил алгоритм в "пузырек".


--------------------
PM MAIL   Вверх
toxx
Дата 11.1.2010, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(comcon1 @ 11.1.2010,  18:45)
хихи, чувак, ты не маленько переделал. Ты превратил алгоритм в "пузырек".

Неа, это сортировка выбором элемента

Вроде как выбираем элемент
Код

 for ( i = 0; i < N-1; i++)

И сравниваем поочередно
Код

 for  (j = i+1; j<N; j++)
        if (A[i] < A[j])


Блин или наврал чтото?)Так просто набросал, пузырек это вроде когда элемент самый большой вытесняют в конец массива?)


Это сообщение отредактировал(а) toxx - 11.1.2010, 18:51
PM MAIL   Вверх
artsb
Дата 11.1.2010, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код

        if (B < A[j])
        {
            for (k = i; k > j; k--)
                A[k] = A[k-1];
             A[j] = B; // это сюда
             break;  // и это ещё надо
        }


Добавлено через 2 минуты и 12 секунд
user posted image


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
papochka
Дата 11.1.2010, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(bsa @ 11.1.2010,  18:36)
в строке 21 попробуй поставить условие k <= j
в строке 25 i замени на j

Код

    if (B < A[j])

Вот это заменить? (20, на 21-й скобочка.)

Добавлено через 1 минуту и 36 секунд
Цитата(artsb @ 11.1.2010,  18:49)
Код

        if (B < A[j])
        {
            for (k = i; k > j; k--)
                A[k] = A[k-1];
             A[j] = B; // это сюда
             break;  // и это ещё надо
        }


Добавлено @ 18:52
user posted image

О, спасибо. Запарился немног))
Теперь понятно.
PM MAIL   Вверх
artsb
Дата 11.1.2010, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(papochka @  11.1.2010,  18:15 Найти цитируемый пост)
И если можно, как я код для новичка оформляю.Можно неск. советов.

Я бы так оформил:
Код

int main ()
{
 const int N = 10;
 int B,i,j,k;
 int A[N];
 printf("Vvod massiva: \n");

 for(i = 0; i < N; i++) {
  printf("A[%d]=\a", i);
  scanf("%d", &A[i]);
 }
 for(i = 1; i < N; i++) {
  B = A[i];
  for(j = 0; j < i; j++)
   if(B < A[j]) {
    for(k = i; k > j; k--)
     A[k] = A[k-1];
    A[j] = B;
    break;
   }
 }
 printf("Sort Massiv: ");

 for(i = 0; i < N; i++)
  printf("%d ", A[i]);

 getch();
 return 0;
}

Но тут, как говорится, на свой вкус и цвет. Каждый оформляет по-своему. Главное чтобы читабельно было ИМХО

Добавлено через 1 минуту и 57 секунд
Цитата(papochka @  11.1.2010,  18:53 Найти цитируемый пост)
Теперь понятно. 

Ещё на эту строку обратите внимание:
Код

for(k = i; k > j; k--)

Я в комментах про неё ничего не написал...


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
comcon1
Дата 11.1.2010, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

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



toxx,  нет. Сортировка выбором, это поиск минимума и установка в начало, потом в оставшемся ищем минимум - и в начало. А у тебя двойной цикл, сравниваются попарно все элементы и меняются местами в сторону большего - это и есть пузырек (может он и называется не пузырек, но максимум там всплывает, нет, только что проверил - это пузырек).


--------------------
PM MAIL   Вверх
Dov
Дата 11.1.2010, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

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



Сортировка выбором - это нахождение в массиве минимального или максимального(если сортируем по убыванию) элемента (а иногда и того и другого, если сортировка двунаправленная) и обмен его с текущим элементом. И так до конца массива, исключая из поиска ранее отсортированные элементы.

Добавлено через 1 минуту и 9 секунд
comcon1 уже дал определение...   smile 


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
papochka
Дата 11.1.2010, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо.
Теперь ещё буду ковырять Быструю сортировку.)
Идея в том, что массив делится на два подмассива. В левую часть идёт элемент меньший, чем элемент в качестве среднего. В правую - больший.

Буду соображать, как сделать =)
PM MAIL   Вверх
toxx
Дата 11.1.2010, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(comcon1 @ 11.1.2010,  19:08)
toxx,  нет. Сортировка выбором, это поиск минимума и установка в начало, потом в оставшемся ищем минимум - и в начало. А у тебя двойной цикл, сравниваются попарно все элементы и меняются местами в сторону большего - это и есть пузырек (может он и называется не пузырек, но максимум там всплывает, нет, только что проверил - это пузырек).

Ошибочка значит вышла)Подзабыл уже сортировки)Вроде понатыкал, чето исправил, что аж переделал в другой метод оказывается=)

Это сообщение отредактировал(а) toxx - 11.1.2010, 19:17
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




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


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

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