Portál AbcLinuxu, 30. dubna 2025 16:51

Quicksort

6.3.2005 13:00 | Přečteno: 3949× | Linux | poslední úprava: 8.7.2005 09:43

Nemaje klasického informatického vzdělání byl jsem toho ve škole ušetřen. O čem mluvím? Všechny ty algoritmy pro třídění a tak. No a pak to člověk potřebuje a neví. Když už to zjistí, tak si to chce vytesat do kamene. Ehm do webu. Tak taky rozšířím zbytečně duplicitní stránky, na kterých je taková, nebo onaká implementace quicksortu. Až to zas někdy budu potřebovat a jestli bude abíčko ještě existovat, tak to třeba tady najdu.

#include <sys/time.h>
#include <stdio.h>
#include <stdlib.h>

#define timedif(start, stop) \
  (u_int)((stop)->tv_sec - (start)->tv_sec - ((stop)->tv_usec < (start)->tv_usec))

#define utimedif(start, stop) \
  (u_int)((stop)->tv_usec - (start)->tv_usec + 1000000*((stop)->tv_usec < (start)->tv_usec))

#define N       (10000000)
#ifndef __u_char_defined
typedef __u_int u_int;
#endif
u_int numbers[N];

#define swap(i,j) \
  { register u_int pom=*i; *i=*j; *j=pom; }

void quicksort(u_int *start, u_int *end)
{
  u_int *i, *low=start;       /* low is place for pivot */
  for(i=start; i<end; i++)
  {
    if(*i<*end) /* end element is pivot */
    {
      swap(i, low);
      low++;
    };
  };
  swap(low, end);  /* place pivot to his place */
  if(start<low-1)
    quicksort(start, low-1);
  if(low+1<end)
    quicksort(low+1, end);
}

int main(void)
{
  u_int rand_seed;
#ifdef __USE_BSD
  struct timezone foo_;
  struct timezone *foo=&foo_;
#else
  void *foo=NULL;
#endif
  struct timeval start, stop;

  gettimeofday(&start, foo);
  rand_seed = start.tv_usec;
  srand(rand_seed);

  {     /* init numbers */
    u_int i;
    for(i=0; i<N; i++)
      numbers[i]=rand();
  }

  /* start measure */
  gettimeofday(&start, foo);
  quicksort(numbers, numbers+N-1);
  /* measure time */
  gettimeofday(&stop, foo);
  printf("#Sorting %d numbers consumed %d.%06dsec\n",
      N, timedif(&start, &stop), utimedif(&start, &stop));

  {     /* test result */
    u_int i;
    char OK=1;
    for(i=0; i<N-1 && (OK &= numbers[i]<= numbers[i+1]); i++);
    printf(OK?"All OK.\n":"Something bad.\n");
    return !OK;
  }
}

P.S.: Tato implementace není vhodná pro částečně setříděné pole. Patch pro částečně setříděná pole:

@@ -20,6 +20,7 @@
 void quicksort(u_int *start, u_int *end)
 {
   u_int *i, *low=start;       /* low is place for pivot */
+  swap(start+(end-start)/2, end);
   for(i=start; i<end; i++)
   {
     if(*i<*end) /* end element is pivot */
       

Hodnocení: 100 %

        špatnédobré        

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře. , Tisk

Vložit další komentář

6.3.2005 15:52 Christof | skóre: 22 | Havířov
Rozbalit Rozbalit vše BogoSort
Odpovědět | Sbalit | Link | Blokovat | Admin
QuickSort je k ničemu, nejlepší třídící algoritmus je BogoSort :-) viz http://en.wikipedia.org/wiki/Bogosort
6.3.2005 19:15 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
Rozbalit Rozbalit vše Re: BogoSort
Tak ten je fakt dobrej. Ten ihned implementuju do svého realtime adaptivního regulátoru.
XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
Vašek Lorenc avatar 7.3.2005 01:02 Vašek Lorenc | skóre: 27
Rozbalit Rozbalit vše Re: BogoSort
Tak, jak je tam uvedený, má jednu zásadní chybku -- když půjde všechno šejdrem, není nikde zaručeno, že to vůbec skončí.. Ale jinak je to dost kvalitka, o tom žádná :)
...včetně majestátného loosa
6.3.2005 16:32 Honza "tux" Friesse | skóre: 15 | blog: Tuxův blog | Vyškov
Rozbalit Rozbalit vše To se hodí...
Odpovědět | Sbalit | Link | Blokovat | Admin
... ještě sem hoď nějaké stromové etudy (AVL stromy,...) a nějaké vyhledávací algoritmy (třeba boyer-moora). To by opravdu mnohým pomohlo (včetně mě).
Vašek Lorenc avatar 6.3.2005 17:05 Vašek Lorenc | skóre: 27
Rozbalit Rozbalit vše Re: To se hodí...
A případně trochu povídání o dynamickém programování a aproximativních algoritmech, ať si lidi trochu počtou -- evidentně je to občas potřeba a praktické příklady kolem toho se hodí..
...včetně majestátného loosa
6.3.2005 23:33 Jiri Bajer | skóre: 34 | blog: Sarimuv koutek | Praha
Rozbalit Rozbalit vše Re: To se hodí...
Mrkni se na knihovnu Aapl, treba tam najdes uz hotove reseni... Why to reinvent the wheel? ;-)
7.3.2005 08:48 Ladislav Thon
Rozbalit Rozbalit vše Malá noticka terminologická...
Odpovědět | Sbalit | Link | Blokovat | Admin
Je to skutečně třídění, nebo spíš řazení? :)
7.3.2005 09:12 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
Rozbalit Rozbalit vše Re: Malá noticka terminologická...
No to mě mohlo napadnout, ale nenapadlo. Tak jo, je to řazení. Spokojen?
XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
7.3.2005 09:26 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
Rozbalit Rozbalit vše Re: Malá noticka terminologická...
A vlastně jo. Je to třídící algoritmus, jehož výsledkem je seřazená posloupnost. Jiné řadící algoritmy možná skutečně provádějí řazení, ale tenhle ne. Tenhle třídí. Co jiného dělá tahle část?
  for(i=start; i<end; i++)
  {
    if(*i<*end) /* end element is pivot */
    {
      swap(i, low);
      low++;
    };
  };
Ta část jednoznačně provádí třídění na prvky menší než *end a na prvky nemenší. To je třídění jak vyšité. Je to třídící algoritmus na řazení rpvků.
XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
7.3.2005 17:44 Michal Marek (twofish) | skóre: 55 | blog: { display: blog; } | Praha
Rozbalit Rozbalit vše Re: Malá noticka terminologická...
O řadících algoritmech jsem ještě neslyšel... Ale je pravda, že železniční doprava není zrovna můj obor :)
8.3.2005 08:30 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
Rozbalit Rozbalit vše Re: Malá noticka terminologická...
Ale no tak. Vždyť má pravdu. Třídící algoritmus by musel něco třídit a třídění je rozdělování nějakého souboru dat do kategorií. Výsledkem řazení je seřazený soubor dat, což je jaksi něco úplně jiného.
XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
8.8.2005 08:23 net-ray
Rozbalit Rozbalit vše Dodatek
Odpovědět | Sbalit | Link | Blokovat | Admin
Vyraz start+(end-start)/2 lze napsat takto: (start+end)/2
b42 avatar 7.6.2007 22:44 b42 | skóre: 12 | Ostrava/Brno
Rozbalit Rozbalit vše Re: Quicksort
Odpovědět | Sbalit | Link | Blokovat | Admin
(ja vim ze jsem se asi o dva roky zpozdil, ale kdyby na to nekdo nekdy nahodou narazil tak:) http://googleresearch.blogspot.com/2006/06/extra-extra-read-all-about-it-nearly.html

Založit nové vláknoNahoru

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.