Школа программиста

Забыли пароль?
[задачи] [курсы] [олимпиады] [регистрация]
Логин:   Пароль:    
Скрыть меню
О школе
Правила
Олимпиады
Фотоальбом
Гостевая
Форум
Архив олимпиад
Архив задач
Состояние системы
Рейтинг
Курсы
Новичкам
Работа в системе
Курсы ККДП
Дистрибутивы
Статьи
Ссылки


 
Вернуться
Тема: Сортировка по полярному углу
1
  1  Навойчик Андрей Валентинович, 12 ноября 2009 г. 19:10:12
      Нагин Сергей, спасибо...ща попробуем))))
  2  Нагин Сергей Юрьевич, 12 ноября 2009 г. 17:27:40
      Вроде-бы так!
  3  Нагин Сергей Юрьевич, 12 ноября 2009 г. 17:27:25
      procedure sort(l,r: longint);
var
i,j,x,y: longint;
begin
i:=l;
j:=r;
x:=a[(l+r) div 2];
repeat
while pol(a[i])<pol(x) do
inc(i);
while pol(x)<pol(a[j]) do
dec(j);
if not(i>j) then
begin
y:=a[i];
a[i]:=a[j];
a[j]:=y;
inc(i);
j:=j-1;
end;
until i>j;
if l<j then
sort(l,j);
if i<r then
sort(i,r);
end;
функция "пол", определяет полярный угол между 1й точкой и точкой Х или Аи!
  4  Навойчик Андрей Валентинович, 12 ноября 2009 г. 13:18:55
      если использовать сортировку пузырьком то это кодится так:
Vect - функция которая определяет знак векторного произведения;
a - массив of ll;
ll=record
x,y:longint;
в а[1] содержится самоя низкая левая координата
for i:=2 to n-1 do
for j:=i+1 to n do
if Vect(a[1],a[i],a[1],a[j])<0 then
Swap(a[i],a[j]);
Как это будет выглядить в QSort???
  5  Беляев Сергей Николаевич, 12 ноября 2009 г. 11:09:42
      Более эффективно, как говорит Нвойчик А.В., сортировать не по углу,а по знаку векторного произведения соответствующих векторов. При такой сортировке используется гораздо меньше арифметических операций, в частности не используется извлечение квадратного корня.
  6  Прищенко Богдан Олегович, 11 ноября 2009 г. 22:19:08
      Я бы сначала просчитал для каждой точки ее полярный угол относительно точки-образца, завел соответствующий массив, а потом сортировал эти углы. Только при сортировке углов менять не только два угола, но и соответствующую им пару точек.
  7  Навойчик Андрей Валентинович, 11 ноября 2009 г. 20:49:50
      *вписать
  8  Навойчик Андрей Валентинович, 11 ноября 2009 г. 20:49:31
      все понятно, кроме функции. По идее нужно узнать векторное произведение векторов, и если оно меньше 0, то поменять местами значения a[i] и a[j]...вопрос: как эту функцию вписоть в QSort???
  9  Нагин Сергей Юрьевич, 11 ноября 2009 г. 18:46:35
      берешь , ставишь ее первой в списке! Потом пишешь сорт(2,Н) и оно отсортирует! А в сортировке пишешь сравнение по полярному углу, тоесть , не Аи ,а Ф(Аи) , тоесть значение от определенной функции полярного угла!
  10  Навойчик Андрей Валентинович, 11 ноября 2009 г. 17:25:53
      Привет всем!!!
Подскажите, пжл, как при помощи алгоритма быстрой сортировки О(N log N) отсортировать массив координат по полярному углу относительно какой-либо из этих точек (например самой нижней левой)
1

Чтобы оставить сообщение необходимо зарегистрироваться и авторизоваться!

Красноярский краевой Дворец пионеров, (c)2006 - 2026, ИНН 246305493507, E-mail: admin@acmp.ru