Re: быстpая соpтиpовка

From
Oleg I. Khovayko ()
To
Nick Kovaliov
Date
2002-12-26T17:28:16Z
Area
RU.ALGORITHMS
From: "Oleg I. Khovayko" <olegh@ncbi.nlm.nih.gov>

Nick Kovaliov wrote:
> 
> Ну может ещё не побитовая, и по 2-4 бита, например.
> Всё же быстрее будет уже во сколько раз.

Я что-то не представляю, как можно сделать сортировку
по группе бит без использования значительной дополнительной памяти
для сортируемых данных. Простого обмена здесь не выйдет.
А вот с памятью у "заказчика" как раз напряженка.

Или я ошибаюсь, и такой алгоритм есть? Если так - кинь в эху 
свою реализацию групповой побитивой сортировки, не требующей
значительной дополнительной памяти под данные.

Вот моя реализация побитивой обменной сортировки, 
использующая только одно дополнительное слово
под данные (переменная tmp). Кстати, при желании переменную
tmp можно сделать статической (общей для всех уровней рекурсии),
а то и вообще обойтись без нее, обменивая данные тремя XOR-ами.

Итак, мой исходник тут:


#include <stdio.h>
#include <stdlib.h>

void bitsort(int *begin, int *end, unsigned int mask) {
  int *p1 = begin, *p2 = end, tmp;

  if(p1 < p2 && mask) {
    do {
     
      if((*p1 & mask) == 0) { p1++; continue; }
      if((*p2 & mask) != 0) { p2--; continue; }

      tmp = *p1; *p1++ = *p2; *p2-- = tmp;
 
    } while(p1 <= p2); 
    /* "<=" above need for correct recursive call below */

    mask >>= 1;
   
    bitsort(begin, p2, mask);
    bitsort(p1,   end, mask);

  } /* if mask & ptrs */

} /* bitsort */

#define LEN 150


main() {

 int mas[LEN];
 
 int i;

 for(i = 0; i < LEN; i++)
   mas[i] = i ^ 53;
 
 printf("start sortir...\n");
 bitsort(mas, mas+LEN-1, 1 << 15);
 printf("end   sortir\n");
 
 for(i = 0; i < 15; ++i)        printf(" %d", mas[i]); printf("...");
 for(i = LEN-15; i < LEN; ++i)  printf(" %d", mas[i]); printf("\n");

}

Теперь ваш исходник -- в студию!

-- 
#include <best/regards.hpp>
Oleg I. KHOVAYKO  
(301)435-5885 || WEB: http://olegh.spedia.net
--- ifmail v.2.15dev5
 * Origin: National Center for Biotechnology Information (2:5020/400)