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

From
Kommander Bomber (2:5059/26.17)
To
Sergey Panfilov
Date
2002-12-24T19:46:10Z
Area
RU.ALGORITHMS

Привет, Alexx!
 AO> помогите плиз, а то вpемени мало. нyжно пpосто-напpосто отсоpтиpовать
 AO> массив двyхбайтных чисел, но вpемя соpтиpовки кpитично
 AO> (микpоконтpоллеpная система).

 Надеюсь, по исходнику поймешь как работает. Основная функция - sort.

=== Здесь начинается src.c ===
typedef unsigned short uint16;
typedef long int32;
typedef short int16;

typedef int16 sizer;
/*typedef int32 sizer;*/

void sort1(uint16 *mas, sizer razm) {
uint16 swp, prefix;
sizer i,j;
sizer Pakety[128];

 if (razm>2/*или не 2, а больше, тогда оставшееся отработать отдельно,
    например использовать quicksort для razm, удовлетворяющих
    условию 256+2*razm>razm*log(2,razm)*/) {
    prefix=mas[0]&0xff80;
    for (i=0; i<128; i++) Pakety[i]=0;
    for (i=0; i<razm; i++) Pakety[mas[i]&0x7f]++;
    j=0;
    for (i=0; i<128; i++)
        while (Pakety[i]--)
              mas[j++]=prefix|((uint16)i);
 } else
   if (mas[0]>mas[1]) {
      swp=mas[0];mas[0]=mas[1];mas[1]=swp;
   }
}

uint16 *sort(uint16 *Massiv, sizer Razmer) {
 sizer Pakety[512],i,t;
 uint16 *Massiv1;


  for (i=0; i<512; i++) Pakety[i]=0;
  for (i=0; i<Razmer; i++) Pakety[Massiv[i]>>7]++;
  for (i=1; i<512; i++) Pakety[i]+=Pakety[i-1];
  Massiv1=(uint16 *)malloc(Razmer*sizeof(uint16));
  for (i=0; i<Razmer; i++)
      Massiv1[--Pakety[Massiv[i]>>7]]=Massiv[i];
  for (i=0; i<511; i++)
      if ((t=Pakety[i+1]-Pakety[i])>1)
         sort1(&Massiv1[Pakety[i]], t);
  if ((t=Razmer-Pakety[511])>1)
     sort1(&Massiv1[Pakety[i]], t);

  return Massiv1;
}
=== А здесь src.c кончается ===

--- GoldED/W32 3.0.1-asa8
 * Origin: -or- (2:5059/26.17)