Сортировка без сравнения
От: UgN  
Дата: 22.01.03 11:14
Оценка:
Вроде еще не было...


Дано:

Массив из N чисел. Все числа из диапазона от 0 до M.

Надо:

Вывести числа отсортированными по возрастанию.

Ограничение: нельзя пользоваться сравнениями

Пример:

Дано: M = 11, N = 6 : 9 5 10 2 2 7

Ответ: 2 2 5 7 9 10
Re: Сортировка без сравнения
От: Кодт Россия  
Дата: 22.01.03 11:21
Оценка:
Здравствуйте, UgN, Вы писали:

UgN>Дано:


UgN>Массив из N чисел. Все числа из диапазона от 0 до M.


UgN>Надо:


UgN>Вывести числа отсортированными по возрастанию.


UgN>Ограничение: нельзя пользоваться сравнениями


Завести массив [0..M] счетчиков в диапазоне [0..N] (или 0..1, если числа не повторяются)

За один проход по набору данных — сосчитать.

За один проход по массиву счетчиков — вывести каждое значение индекса столько раз, чему равен счетчик.

(Ранее упоминалось на сайте под названием "сортировка нахаляву")
Перекуём баги на фичи!
Re: Сортировка без сравнения
От: m.a.g. Мальта http://dottedmag.net/
Дата: 22.01.03 11:25
Оценка:
Здравствуйте, UgN, Вы писали:


UgN>Вывести числа отсортированными по возрастанию.


[Зевая] Сортировка подсчетом.

int count[M+1]={0};

for(int i = 0; i != n; ++i)
  count[a[i]]++;


for(int j = 0, curr = 0; j <= M; ++j)
  while(count[j]--)
      a[curr++] = j;
... << Кино -(Звезда по имени Солнце,1989)- 06-Пачка сигарет >> ...
Re[2]: Сортировка без сравнения
От: UgN  
Дата: 22.01.03 11:25
Оценка:
Здравствуйте, Кодт, Вы писали:

К>(Ранее упоминалось на сайте под названием "сортировка нахаляву")


Не доглядел...
Re: Сортировка без сравнения
От: cab  
Дата: 22.01.03 16:31
Оценка:
Здравствуйте, UgN, Вы писали:

UgN>Вроде еще не было...


UgN>

UgN>Дано:

UgN>Массив из N чисел. Все числа из диапазона от 0 до M.


UgN>Надо:


UgN>Вывести числа отсортированными по возрастанию.


UgN>Ограничение: нельзя пользоваться сравнениями


UgN>Пример:


UgN>Дано: M = 11, N = 6 : 9 5 10 2 2 7


UgN>Ответ: 2 2 5 7 9 10


нельзя пользоваться операторами сравнения????
тоды их можно заментиь двумя функциями:

int max(int a, int b)
{
   return (a+b+abs(a-b))/2;
}

int min(int a, int b)
{
  return ((a+b)-abs(a-b))/2;
}


ну а там дальше все ясно........
все ясно?????
Re: mathsort
От: gloomy rocker Россия  
Дата: 22.01.03 17:55
Оценка:
Заходишь на ya.ru и ищешь по ключевому слову mathsort.
... << RSDN@Home 1.0 beta 4 >>
Скука — двигатель прогресса.
Re[2]: mathsort
От: fAX Израиль  
Дата: 22.01.03 23:50
Оценка:
Здравствуйте, gloomy rocker, Вы писали:

GR>Заходишь на ya.ru и ищешь по ключевому слову mathsort.

А также radix sort, counting sort.
...Complex problems have simple, easy-to-understand wrong answers...
(Grossman's Misquote of H.L.Mencken)
Re[2]: Сортировка без сравнения
От: Кодт Россия  
Дата: 23.01.03 09:07
Оценка:
Здравствуйте, cab, Вы писали:

cab>int max(int a, int b)
cab>{
cab>   return ((a+b)+abs(a-b))/2;
cab>}

cab>int min(int a, int b)
cab>{
cab>  return ((a+b)-abs(a-b))/2;
cab>}


Вообще-то, abs неявно использует сравнение с 0...
Хотя, если использовать представление "знак+величина", можно просто сбрасывать знак...

cab>ну а там дальше все ясно........

cab>все ясно?????

void sort2(int& a, int& b)
{
  int mi = min(a,b), ma = max(a,b);
  a = mi; b = ma;
}

void sort(int data[], int size)
{
  // аналог пузырьковой сортировки
  // без смены направления движения
  int i,j;
  for(i = 0; i<(size-1); i++)
    for(j = 0; j<(size-1); j++)
      sort2(data[j], data[j+1]);
}
Перекуём баги на фичи!
Re[3]: Сортировка без сравнения
От: mrhru Россия  
Дата: 23.01.03 09:20
Оценка: 14 (1)
Здравствуйте, Кодт, Вы писали:

...

К>Вообще-то, abs неявно использует сравнение с 0...

К>Хотя, если использовать представление "знак+величина", можно просто сбрасывать знак...

  abs( x ) = sqrt( x * x )
К>
Евгений, с приветом (но без остроумной подписи, к сожалению )
Re[3]: Сортировка без сравнения
От: kmn Украина  
Дата: 23.01.03 09:47
Оценка: 28 (1)
Здравствуйте, Кодт, Вы писали:


К>Вообще-то, abs неявно использует сравнение с 0...

К>Хотя, если использовать представление "знак+величина", можно просто сбрасывать знак...

если учесть (предположить), что числа хранятся в дополнителном коде, то получить модуль числа не сложно:


int sign = (value & (1 << (sizeof(int)*8 - 1))); // 0x80000000 or 0x00000000

// тиражирование знакового бита
for (int i = 1 ; i < sizeof(int)*8; ++i)
{
   sign |= sign >> i;
}

// должно получиться sign = 0xFFFFFFFF or 0x00000000

value = ((value ^ sign) & MAX_INT) + (sign & 01); // MAX_INT == 0x7FFFFFFF

P.S. на асме это займет несколько строк.
Поиск без сравнения
От: tacit Россия  
Дата: 23.01.03 10:42
Оценка:
А я вот такого здесь не видел:

Дано, ну скажем, 2 числа DWORD.
Найти минимум из этих чисел не используя команд сравнения.
Задача имеет решение в >= 4 машинные команды X86.


P.S. Задача, конечно, по большей части на знание ASM'a, но мне она в своё время очень понравилась.
... << RSDN@Home 1.0 beta 5 >>
Re[2]: Сортировка без сравнения
От: DmitryBoboshko  
Дата: 23.01.03 14:17
Оценка:
Здравствуйте, m.a.g., Вы писали:

MAG>Здравствуйте, UgN, Вы писали:


MAG>

UgN>>Вывести числа отсортированными по возрастанию.

MAG>[Зевая] Сортировка подсчетом.


MAG>
MAG>int count[M+1]={0};

MAG>for(int i = 0; i != n; ++i)
MAG>  count[a[i]]++;

MAG>
MAG>for(int j = 0, curr = 0; j <= M; ++j)
MAG>  while(count[j]--)
MAG>      a[curr++] = j;

MAG>


А с каких это пор
for( for-init-statement; expression1; expression2 )
{
    // Statements
}

или
while( expression1 )
{
    // Statements
    expression2;
}

перестали использовать сравнения внутри себя? Или же речь шла только о несравнении значений массива?
Тут возникает вопрос: нельзя ли действительно обойтись каких либо сравнений, ну разве что при проходе массива — не вышли ли мы за его пределы?
Re[3]: Сортировка без сравнения
От: m.a.g. Мальта http://dottedmag.net/
Дата: 24.01.03 08:44
Оценка:
Здравствуйте, DmitryBoboshko, Вы писали:


DB>перестали использовать сравнения внутри себя? Или же речь шла только о несравнении значений массива?


По всей видимости, да. Любое ветвление подразумевает неявное сравнение с нулем А без ветвлений только линейную программу и можно написать.
... << 02. Веретено >> ...
Re: Сортировка без сравнения
От: mihoshi Россия  
Дата: 24.01.03 08:48
Оценка:
Здравствуйте, UgN, Вы писали:

UgN>Ограничение: нельзя пользоваться сравнениями


Не, нехорошо получается. Народ придумает массу способов сравнивать без оператора сравнения

Ты лучше не запрещай, а ограничивай. Т.е. скажи, чем _можно_ пользоваться.
Re[4]: Сортировка без сравнения
От: mrhru Россия  
Дата: 24.01.03 08:51
Оценка:
Здравствуйте, m.a.g., Вы писали:

MAG>Здравствуйте, DmitryBoboshko, Вы писали:


MAG>

DB>>перестали использовать сравнения внутри себя? Или же речь шла только о несравнении значений массива?

MAG>По всей видимости, да. Любое ветвление подразумевает неявное сравнение с нулем А без ветвлений только линейную программу и можно написать.


Самомодифицирующаяся программа — адрес перехода берется из массива, индексом по которому служит "сравниваемая" величина.
Евгений, с приветом (но без остроумной подписи, к сожалению )
Re[2]: Сортировка без сравнения
От: UgN  
Дата: 24.01.03 08:58
Оценка:
Здравствуйте, mihoshi, Вы писали:

M>Ты лучше не запрещай, а ограничивай. Т.е. скажи, чем _можно_ пользоваться.


Да в общем-то уже решили.

Первый был Кодт.
Потом интересное решение в ветке, начиная с здесь
Автор: cab
Дата: 22.01.03

И, как оказалось, такая задача уже была...
( Хотел убить ветку, не дали... )
Это, конечно не значит, что кто-то не придумает свое оригинально е решение...
Но все же.


А что касается условия...
Сравнивать числа из массива нельзя. Хоть как.
Даже если ты будешь у разности знаковый бит смотреть...
Re[2]: Модератору или кто-там-за-главного...
От: UgN  
Дата: 24.01.03 09:02
Оценка:

Здравствуйте, Кодт, Вы писали:

К>(Ранее упоминалось на сайте под названием "сортировка нахаляву")



Модератору или кто-там-за-главного...:

А слабо сцепить с упомянутой "сортировка нахаляву"???
Re[3]: Модератору или кто-там-за-главного...
От: IT Россия linq2db.com
Дата: 24.01.03 14:56
Оценка:
Здравствуйте, UgN, Вы писали:

UgN>А слабо сцепить с упомянутой "сортировка нахаляву"???


Слабо.
Если нам не помогут, то мы тоже никого не пощадим.
Re[4]: Модератору или кто-там-за-главного...
От: UgN  
Дата: 24.01.03 15:17
Оценка:
Здравствуйте, IT, Вы писали:

UgN>>А слабо сцепить с упомянутой "сортировка нахаляву"???


IT>Слабо.


Э-э-э... Я думал тут Pushkin рулит... Разве нет?

А сцепить нельзя в принципе? Т.е. функциональности такой нет, да?
Re[5]: Модератору или кто-там-за-главного...
От: IT Россия linq2db.com
Дата: 24.01.03 15:26
Оценка:
Здравствуйте, UgN, Вы писали:

UgN>Э-э-э... Я думал тут Pushkin рулит... Разве нет?


Да вроде как он

UgN>А сцепить нельзя в принципе? Т.е. функциональности такой нет, да?


Только ручками в базе данных.
Если нам не помогут, то мы тоже никого не пощадим.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.