IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Пропуск нулей в быстрой сортировке(хоара)., Пропуск нулей
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 7
Пол: Мужской
Реальное имя: Саша

Репутация: -  0  +


Нада доделать задачу, чтобы сортировка пропускала 0. Тоесть сортирувало пропуская нули. Сортировка хоара (процедуры Por, Hoar ). Помагите пожалуйста !

const n=10000;
type mas=array[1..n] of integer;
var
m:mas;
i,kp,kpr:longint; f:text;

Procedure Stv(i:Integer);
Var
f:file of integer;
x:integer;
begin
randomize;
assign(f,'1.txt');
rewrite(f);
for i:=1 to 10000 do
begin
x:=random(10000);
write(f,x);
end;
close(f);
end;


procedure fread(var a:mas);
var f:file of integer;
idx:integer;
begin
idx:=1;
assign(f,'1.txt');
reset(f);
while not eof(f) do
begin
read(f,a[idx]);
idx:=idx+1;
end;
close(f);
end;

Procedure Por(i,j:integer; Var pr:longint);
Var b:integer;
begin
b:=m[i]; m[i]:=m[j]; m[j]:=b;
pr:=pr+1;
end;

Procedure Hoar (l,r:integer; Var p,pr:longint);
var i,j,x,y : integer;
begin

if L<R then begin
p:=p+1;
x:=m[(l+r) div 2];
i:=l; j:=r;
repeat
while m[i]<x do inc(i);
while m[j]>x do dec(j);

if i<=j then
begin
Por(i,j,pr);
Inc(i); Dec (j);
p:=p+1;
end
until i>j;
Hoar(l,j,p,pr);
Hoar(i,r,p,pr);

end
end;




procedure fwrite(Var f:text);
var
i:integer;
begin
assign(f,'2.txt');
rewrite(f);
writeln(f,kp);
writeln(f,kpr);
writeln (f,'');
for i:=n downto 1 do writeln(f,m[i]);
close(f);
end;
begin
STV(i);
fread(m);
Hoar(1,n,kp,kpr);
fwrite(f);
end.

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Быстрая сортировка - не тот метод, где можно "пропускать" определенные значения аналогично методу вставок. Скорее всего, у тебя ничего не выйдет. Придется запоминать позиции, на которых находятся нули и после скончания сортировки восстанавливать их.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3





Группа: Пользователи
Сообщений: 7
Пол: Мужской
Реальное имя: Саша

Репутация: -  0  +


Зачем такие задачи давать студентам wacko.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4





Группа: Пользователи
Сообщений: 7
Пол: Мужской
Реальное имя: Саша

Репутация: -  0  +


volvo, то тогда заместь нуля на начале появитса новая цыфра ? а ноль заместь той цыфре ? Или я не то сделал, у меня получилось вот так -
Просто цыфри:
1
6
0
3
7
Отсортированые(с восстановлениям нуля):
3
1
0
6
7
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






Цитата
то тогда заместь нуля на начале появитса новая цыфра ? а ноль заместь той цыфре ?
Не совсем так... Надо будет сдвигать все от запомненной позиции нуля влево на один элемент (начинать справа, а не слева), и на освободившееся справа место устанавливать 0. И так - столько раз, сколько нулей было в массиве изначально... Move прекрасно решает эту проблему...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6





Группа: Пользователи
Сообщений: 7
Пол: Мужской
Реальное имя: Саша

Репутация: -  0  +


volvo, смотрите я добавил к єтой умове -
 if  i<=j then 
добавил ещё одно "если"
if (a[i]<>0) and (a[j]<>0) then ...
То если у меня в файле 3-2 нуля, то оно их нормально пропускает, а если больше примерно к 20-50 при масиве 10 000 то оно как сказать "вилетают" ис своих мест. Не пойму что делать mega_chok.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






Код "сохранения" и "замены" нулей - в студию...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8





Группа: Пользователи
Сообщений: 7
Пол: Мужской
Реальное имя: Саша

Репутация: -  0  +


Цитата(volvo @ 17.03.2009 18:56) *

Код "сохранения" и "замены" нулей - в студию...

Полностю код:


const n=10000;
type mas=array[1..n] of integer;
var
m:mas;
i,kp,kpr:longint; f:text;

Procedure Stv(i:Integer);
Var
f:file of integer;
x:integer;
begin
randomize;
assign(f,'1.txt');
rewrite(f);
for i:=1 to 10000 do
begin
x:=random(10000);
write(f,x);
end;
close(f);
end;


procedure fread(var a:mas);
var f:file of integer;
idx:integer;
begin
idx:=1;
assign(f,'1.txt');
reset(f);
while not eof(f) do
begin
read(f,a[idx]);
idx:=idx+1;
end;
close(f);
end;


procedure quicksort(var a:mas; Lo,Hi: integer );

procedure sort(l,r: integer; var p,pr:longint);
var
i,j,x,y: integer;
begin
i:=l; j:=r; p:=p+1;
x:=a[(l+r) DIV 2];
repeat
while a[ i ]<x do i:=i+1;
while x<a[ j ] do j:=j-1;
if (i<=j) then
{***} begin
if (a[ i ]<>0) and (a[ j ]<>0) then {***}
begin y:=a[ i ]; a[ i ]:=a[ j ];
a[ j ]:=y; pr:=pr+1;
end;
i:=i+1; j:=j-1;
end;
until i>j;
if l<j then sort(l,j,p,pr);
if i<r then sort(i,r,p,pr);
end;

begin
sort(Lo,Hi,kp,kpr);
end;




procedure fwrite(Var a:mas; var f:text);
var
i:integer;
begin
assign(f,'2.txt');
rewrite(f);
writeln(f,kp);
writeln(f,kpr);
writeln (f,'');
for i:=n downto 1 do writeln(f,a[ i ]);
close(f);
end;
begin
STV(i);
fread(m);
QuickSort(m,1,n);
fwrite(m,f);
end.


При этом рендоме (10 000) нули будут попадатса редко, за весь текстовый файл максимум 3 или вобше их не будет, и спокойно пропускать будет. А если задать например рендомом (100-4) то нулей может быть дочерта ( у меня попадалась под 20-30) то оно их как то не пропускает "до конца" и получаетса не сортировка а каша.

(100-4)
Любые
"Сортированый"

Сообщение отредактировано: volvo -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






А потому что я сказал тебе: QuickSort - это тебе не сортировка вставками... У тебя и при малом количестве нулей ничего не работает (программа, которая вылетает с Segmentation Fault не может считаться рабочей)... Я написал тебе выше, что надо делать. Если хочешь - покажу, как. Не хочешь - отлавливай глюки дальше... Как надоест - скажешь...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10





Группа: Пользователи
Сообщений: 7
Пол: Мужской
Реальное имя: Саша

Репутация: -  0  +


Segmentation Fault ? Что это такое )) ? Как это не работало ? Работает (при 2-3 нуляг гг) !!!

Сообщение отредактировано: -rescue- -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Гость






Если Turbo Pascal пропускает заведомо неправильную программу - это проблемы Turbo Pascal-я. Правильной от этого программа не становится. Попробуй прогнать эту программу под Free Pascal-ем (или Дельфи - консольное приложение), которые гораздо аккуратнее контролируют процесс выполнения - убедишься, что она не рабочая. Хочешь - покажу скриншот...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12





Группа: Пользователи
Сообщений: 7
Пол: Мужской
Реальное имя: Саша

Репутация: -  0  +


volvo, скриншот в Дельфи хочу smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Гость






Цитата
скриншот в Дельфи хочу smile.gif
Ну, хочешь - получи: smile.gif


Эскизы прикрепленных изображений
Прикрепленное изображение
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 26.04.2024 4:50
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name