Книга адресована школьникам средних и старших классов, желающим испытать себя в «олимпийских схватках». Может быть полезна студентам-первокурсникам и преподавателям информатики.
	
		
			Модераторы: Oleg_D, Модераторы
		
	
	
		
		
			
			
			 Garrus_En » 11.03.2013 22:49:03
 Garrus_En » 11.03.2013 22:49:03 
			
			Наткнулся на ошибку в коде второго примера..  запуск программы вывел мне странный реультат:
До сортировки:
549
593
716
845
603
858
545
848
424
624
После сортировки:
424
549
545
845
603
858
716
848
593
629
Из примера видно, что элементы попеременно поменялись местами:
2 с 9 , 1 со 2 , 3 с 6
Не пойму отчего так произошло?  код переписан из примера полностью.
			
		 
		
			
			- 
				Garrus_En
			
- незнакомец
-  
- Сообщения: 9
- Зарегистрирован: 11.03.2013 22:38:26
 
	 
	
	
		
		
			
			
			 Oleg_D » 12.03.2013 09:15:35
 Oleg_D » 12.03.2013 09:15:35 
			
			Garrus_En писал(а):Не пойму отчего так произошло?  код переписан из примера полностью.
Выкладывайте свой код, посмотрим. Мой код таков:
- Код: Выделить всё
- { P_43_2 - Быстрая сортировка }
 
 const CSize=10;    { размер массива }
 
 type TNumbers = array [1..CSize] of Integer;
 var  Arr  : TNumbers;
 
 { Быстрая сортировка }
 
 procedure QuickSort(var arg: TNumbers; aL, aR: Integer);
 var
 L, R : integer; { левый и правый индексы }
 M, T : Integer; { среднее значение и временное хранилище }
 begin
 { Начальные значения левого и правого индексов }
 L:= aL;    R:= aR;
 { Вычисляем среднее значение }
 M:= (arg[L] + arg[(L + R) div 2] + arg[R]) div 3;
 { Цикл встречного движения }
 repeat
 { Пока левый элемент меньше среднего,
 двигаем левый индекс вправо }
 while arg[L] < M do L:=L+1;
 { Пока правый элемент больше среднего,
 двигаем правый индекс влево }
 while arg[R] > M do R:=R-1;
 { После остановки сравниваем индексы }
 if L <= R then begin
 { Если индексы еще не "встретились" }
 if arg[L]>arg[R] then begin
 { и левый элемент оказался больше правого,
 то меняем элементы местами }
 t:= arg[L];  arg[L]:= arg[R]; arg[R]:= t;
 end;
 { Делаем еще шаг навстречу }
 L:=L+1;  R:=R-1;
 end;
 until L > R; { пока индексы не "встретятся" }
 { если левая часть не отсортирована, то сортируем ее }
 if R > aL then QuickSort(arg, aL, R);
 { если правая часть не отсортирована, то ее тоже сортируем }
 if L < aR then QuickSort(arg, L, aR);
 { выход после сортировки обеих частей }
 end;
 
 { Процедура распечатки массива }
 
 procedure ShowArray(const arg: string);
 var i: integer;
 begin
 Writeln(arg);
 for i:=1 to CSize do Writeln(Arr[i]);
 Readln;
 end;
 
 var i: integer;
 
 begin
 { Заполняем массив случайными числами }
 Randomize;
 for i:=1 to CSize do Arr[i]:=1+Random(1000);
 ShowArray('До сортировки:');
 QuickSort(Arr, 1, CSize);
 ShowArray('После сортировки:');
 end.
 
 
 
		
			
			- 
				Oleg_D
			
- постоялец
-  
- Сообщения: 391
- Зарегистрирован: 09.05.2011 11:28:36
 
	 
	
	
		
		
			
			
			 Garrus_En » 12.03.2013 09:43:08
 Garrus_En » 12.03.2013 09:43:08 
			
			один в один..  сидел просматривал... символ к символу...  почти ( ещё строку randomize; добавил перед заполнением)
может быть фпс неможет загнать этот цикл сам в себя?? на каком компиляторе проверялось?
			
		 
		
			
			- 
				Garrus_En
			
- незнакомец
-  
- Сообщения: 9
- Зарегистрирован: 11.03.2013 22:38:26
 
	 
	
	
		
		
			
			
			 Oleg_D » 12.03.2013 09:51:57
 Oleg_D » 12.03.2013 09:51:57 
			
			Garrus_En писал(а):на каком компиляторе проверялось?
На FP 2.6.0 и на Delphi
А вы не глазами проверяйте, к копи-пастом на форум выкладывайте.
 
		
			
			- 
				Oleg_D
			
- постоялец
-  
- Сообщения: 391
- Зарегистрирован: 09.05.2011 11:28:36
 
	 
	
	
		
		
			
			
			 Garrus_En » 12.03.2013 10:56:06
 Garrus_En » 12.03.2013 10:56:06 
			
			- Код: Выделить всё
-         {P_43_2 QuickSort}
 const CSize=10;
 type TNumbers = array [1..CSize] of integer;
 var
 Arr:TNumbers;
 Procedure QuickSort(var arg: TNumbers; aL,aR: integer);
 var
 L,R: integer;
 M,T: integer;
 begin
 L:=aL; R:=aR;
 
 
 M:=(arg[L]+arg[(L+R)div 2]+arg[R])div 3;
 repeat
 while arg[L]<M do L:=L+1;
 while arg[R]>M do R:=R-1;
 if L <= R then begin
 if arg[L]>arg[R] then begin
 t:=arg[L]; arg[L]:= arg[R]; arg[R]:=t;
 end;
 L:=L+1; R:=R-1;
 end;
 until L>R;
 if R>aL then quickSort(arg,aL,R);
 if L>aR then QuickSort(arg,L,aR);
 end;
 procedure ShowArray(const arg:string);
 var i:integer;
 begin
 Writeln(Arg);
 for i:=1 to CSize do Writeln(arr[i]);
 Readln;
 end;
 var i: integer;
 begin
 randomize;
 for i:=1 to CSize do Arr[i]:=1+random(1000);
 ShowArray('До сортировки:');
 QuickSort(Arr,1,CSize);
 ShowArray('После сортировки:');
 end.
вот он
 
		
			
			- 
				Garrus_En
			
- незнакомец
-  
- Сообщения: 9
- Зарегистрирован: 11.03.2013 22:38:26
 
	 
	
	
		
		
			
			
			 Oleg_D » 12.03.2013 11:36:06
 Oleg_D » 12.03.2013 11:36:06 
			
			Надо так:
if L < aR then QuickSort(arg, L, aR);
У вас так (больше вместо меньше):
 if L > aR then QuickSort(arg,L,aR);
И старайтесь форматировать текст аккуратней, для сдвига блоков предварительно выделенного текста очень удобны комбинации клавиш:
Ctrl+K+I  -- сдвиг блока вправо
Ctrl+K+U  -- сдвиг блока влево
Ctrl+K+H  -- отмена выделения блока
			
		 
		
			
			- 
				Oleg_D
			
- постоялец
-  
- Сообщения: 391
- Зарегистрирован: 09.05.2011 11:28:36
 
	 
	
	
		
		
			
			
			 Garrus_En » 12.03.2013 20:25:04
 Garrus_En » 12.03.2013 20:25:04 
			
			Спасибо  

 
		
			
			- 
				Garrus_En
			
- незнакомец
-  
- Сообщения: 9
- Зарегистрирован: 11.03.2013 22:38:26
 
	 
	
	
	
	Вернуться в Книга "Песни о Паскале"
	
	Кто сейчас на конференции
	Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0