Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.04.2013, 20:56   #1
spokey
Новичок
Джуниор
 
Регистрация: 09.04.2013
Сообщений: 3
По умолчанию Сортировка, где ошибся в логике программы?

Помогите разобраться в коде программы:
Код:
#include <stdio.h> 
main(){ 
int dig[10]={5,3,2,4,6,7,11,17,0,13}; 
int i,j,N,mm,tmp; 
N=10; 
for(i=N-1;i>=1;i--){ 
   mm=0; 
   for(j=1;j<=i;j++) 
   if(dig[j] > dig[mm]) 
    mm=j; 
 tmp=dig[i];  
   dig[i]=dig[mm]; 
   dig[mm]=tmp;
} 
for(i=0;i<N;i++) 
   printf("%d ", dig[i]); 
printf("\n"); 
}
1. создается массив, устанавливается значение i= 9
Код:
 for(i=N-1;i>=1;i--)
2. Вложенный цикл
Код:
for(j=1;j<=i;j++)
проходит по массиву, ища наибольшее число.
3. Найдя что это 17, устанавливает mm=5 в mm=6
4. tmp = 13
5. 9-му элементу массива присваивается значение 6-го (т.е. 13 меняется на 17)
6.
Код:
dig[mm]=tmp
получается что 17 заменяется на 13, но я не разберусь, почему. Ведь в
Код:
dig[i]=dig[mm]
13 затирается, становясь 17.
Где я напутал, будьте так любезны поправить )))
spokey вне форума Ответить с цитированием
Старый 09.04.2013, 22:05   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Сначала подумал, что понял, что Вы спрашиваете, но после перечитывания передумал

Вы выбрали текущий элемент для обмена (i-ый).
Выбрали максимальный (mn-ый), который находится до i-го (или сам i-ый).
Присвоили временной переменной tmp значение одной из этих ячеек.
Затем в эту ячейку записали значение другой ячейки.
Затем в ту другую ячейку переписали значение из временной переменной.
Таким образом поменяли местами значения в 2 ячейках.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 09.04.2013, 22:38   #3
spokey
Новичок
Джуниор
 
Регистрация: 09.04.2013
Сообщений: 3
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Сначала подумал, что понял, что Вы спрашиваете, но после перечитывания передумал

1. Вы выбрали текущий элемент для обмена (i-ый).
2. Выбрали максимальный (mn-ый), который находится до i-го (или сам i-ый).
3.Присвоили временной переменной tmp значение одной из этих ячеек.
4.Затем в эту ячейку записали значение другой ячейки.
5.Затем в ту другую ячейку переписали значение из временной переменной.
6.Таким образом поменяли местами значения в 2 ячейках.
1. Да, выбран крайний элемент (который с каждым проходом цикла уменьшается).
2. Да, максимальный в заданном массиве.
3. Крайней
4. Максимальное значение массива ушло в конец
5. Ага, получается что tmp не изменилась, и на место максимальной ушло значение крайней (9-й), то есть где было 17 стало 13.
6. Спасибо большое, разобрался.
spokey вне форума Ответить с цитированием
Старый 09.04.2013, 22:56   #4
Че Гевара
Форумчанин
 
Аватар для Че Гевара
 
Регистрация: 25.09.2012
Сообщений: 182
По умолчанию

Как я понял это сортировка методом выбора максимального элемента. Вот код с подробными коментариями, как она должна делаться
Код:
#include <stdio.h>
#include <conio.h>
#include <locale.h>

#define N 10

main()
{
setlocale(LC_ALL,"RUS");
int i, j, tmp, max, maxN;
int dig[N]={5,3,2,4,6,7,11,17,0,13};
	for(i = N - 1;i >= 0;i--)//сортируем с конца массива
	{
	max = dig[i];//принимаем за максимальный элемент dig[i] (условно)
		for(j = i - 1;j >= 0;j--)//в этом цикле ищем максимальный элемент
		{
			if(max < dig[j])//если условный максимальный элемент меньше анализируемого
			{
			max = dig[j];//принимаем его за максимальный
			maxN = j;//запоминаем его порядковый номер
			}
		}
		if(dig[i] != max)//если нынешний максимальный элемент не совпадает с принятым в начале
		{
		tmp = dig[i];//меняем 
		dig[i] = max;//их
		dig[maxN] = tmp;//местами
		}
	}
	for(i = 0;i < N;i++)
	{
	printf("%d, ", dig[i]);
	}
getch();
}
Отладка кода вдвое сложнее, чем его написание. Так что если вы пишете код настолько умно, насколько можете, то вы по определению недостаточно сообразительны, чтобы его отлаживать.
Brian W. Kernighan.
Че Гевара вне форума Ответить с цитированием
Старый 09.04.2013, 23:16   #5
spokey
Новичок
Джуниор
 
Регистрация: 09.04.2013
Сообщений: 3
По умолчанию

Цитата:
Сообщение от Че Гевара Посмотреть сообщение
Как я понял это сортировка методом выбора максимального элемента. Вот код с подробными коментариями, как она должна делаться
Да, методом выбора max элемента.
Спасибо за пример, мне конечно до такого уровня, как до Китая наклонившиси ))) но суть уловил.
spokey вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Транслировал код с C++, где ошибся? Crystallon Общие вопросы Delphi 4 10.05.2012 02:31
не могу найти ошибку в логике программы pinkiller Общие вопросы C/C++ 0 11.11.2011 20:01
Работа с циклом ( находим сумму) - не могу понять , где ошибся ) zipo666 Помощь студентам 3 01.11.2011 12:51
Объясните пожалуйста, где и как ошибся Manchester Паскаль, Turbo Pascal, PascalABC.NET 10 09.02.2009 20:51
Не разберу где ошибся, по моему много напутал Forro Паскаль, Turbo Pascal, PascalABC.NET 6 14.01.2008 14:19