Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1.  
  2. ///===========================================
  3. ///
  4. /// Áèáëèîòåêà ôóíêöèé áûñòðîé ñîðòèðîâêè
  5. ///
  6. ///
  7. /// Áàçîâûé êîä áûë âçÿò ñ ñàéòà algolist.manual.ru
  8. ///
  9. /// Ñêîìïîíîâàë À. Áîãîìàç aka Albom (albom85@yandex.ru)
  10. ///===========================================
  11.  
  12.  
  13. ///===========================================
  14. /// Ñîðòèðîâêà äëÿ ïåðåìåííûõ òèïà int (4 áàéòà)
  15. ///===========================================
  16. void qsi(int *a, int n)
  17. {
  18.  
  19. int i, j;
  20. int temp, p;
  21.  
  22. p = *(a+(n>>1));
  23.  
  24. i = 0;
  25. j = n;
  26.  
  27. do
  28.         {
  29.         while ( *(a+i) < p ) i++;
  30.         while ( *(a+j) > p ) j--;
  31.  
  32.         if (i <= j)
  33.                 {
  34.                 temp = *(a+i);
  35.                 *(a+i) = *(a+j);
  36.                 *(a+j) = temp;
  37.                 i++;
  38.                 j--;
  39.                 }
  40.         } while ( i<=j );
  41.  
  42. if ( j > 0 )
  43.         qsi(a, j);
  44. if ( n > i )
  45.         qsi(a+i, n-i);
  46.  
  47. }
  48.  
  49. ///===========================================
  50. /// Ñîðòèðîâêà äëÿ ïåðåìåííûõ òèïà short int (2 áàéòà)
  51. ///===========================================
  52.  
  53. void qss(short *a, int n)
  54. {
  55.  
  56. int i, j;
  57. short temp, p;
  58.  
  59. p = *(a+(n>>1));
  60.  
  61. i = 0;
  62. j = n;
  63.  
  64. do
  65.         {
  66.         while ( *(a+i) < p ) i++;
  67.         while ( *(a+j) > p ) j--;
  68.  
  69.         if (i <= j)
  70.                 {
  71.                 temp = *(a+i);
  72.                 *(a+i) = *(a+j);
  73.                 *(a+j) = temp;
  74.                 i++;
  75.                 j--;
  76.                 }
  77.         } while ( i<=j );
  78.  
  79. if ( j > 0 )
  80.         qss(a, j);
  81. if ( n > i )
  82.         qss(a+i, n-i);
  83.  
  84. }
  85.  
  86. ///===========================================
  87. /// Ñîðòèðîâêà äëÿ ïåðåìåííûõ òèïà char (1 áàéò)
  88. ///===========================================
  89.  
  90. void qsc(char *a, int n)
  91. {
  92.  
  93. int i, j;
  94. char temp, p;
  95.  
  96. p = *(a+(n>>1));
  97.  
  98. i = 0;
  99. j = n;
  100.  
  101. do
  102.         {
  103.         while ( *(a+i) < p ) i++;
  104.         while ( *(a+j) > p ) j--;
  105.  
  106.         if (i <= j)
  107.                 {
  108.                 temp = *(a+i);
  109.                 *(a+i) = *(a+j);
  110.                 *(a+j) = temp;
  111.                 i++;
  112.                 j--;
  113.                 }
  114.         } while ( i<=j );
  115.  
  116. if ( j > 0 )
  117.         qsc(a, j);
  118. if ( n > i )
  119.         qsc(a+i, n-i);
  120.  
  121. }
  122.  
  123. ///===========================================
  124. /// Ñîðòèðîâêà äëÿ ïåðåìåííûõ òèïà unsigned int (4 áàéòà)
  125. ///===========================================
  126. void qsui(unsigned *a, int n)
  127. {
  128.  
  129. int i, j;
  130. unsigned temp, p;
  131.  
  132. p = *(a+(n>>1));
  133.  
  134. i = 0;
  135. j = n;
  136.  
  137. do
  138.         {
  139.         while ( *(a+i) < p ) i++;
  140.         while ( *(a+j) > p ) j--;
  141.  
  142.         if (i <= j)
  143.                 {
  144.                 temp = *(a+i);
  145.                 *(a+i) = *(a+j);
  146.                 *(a+j) = temp;
  147.                 i++;
  148.                 j--;
  149.                 }
  150.         } while ( i<=j );
  151.  
  152. if ( j > 0 )
  153.         qsui(a, j);
  154. if ( n > i )
  155.         qsui(a+i, n-i);
  156.  
  157. }
  158.  
  159. ///===========================================
  160. /// Ñîðòèðîâêà äëÿ ïåðåìåííûõ òèïà unsigned short int (2 áàéòà)
  161. ///===========================================
  162.  
  163. void qsus(unsigned short *a, int n)
  164. {
  165.  
  166. int i, j;
  167. unsigned short temp, p;
  168.  
  169. p = *(a+(n>>1));
  170.  
  171. i = 0;
  172. j = n;
  173.  
  174. do
  175.         {
  176.         while ( *(a+i) < p ) i++;
  177.         while ( *(a+j) > p ) j--;
  178.  
  179.         if (i <= j)
  180.                 {
  181.                 temp = *(a+i);
  182.                 *(a+i) = *(a+j);
  183.                 *(a+j) = temp;
  184.                 i++;
  185.                 j--;
  186.                 }
  187.         } while ( i<=j );
  188.  
  189. if ( j > 0 )
  190.         qsus(a, j);
  191. if ( n > i )
  192.         qsus(a+i, n-i);
  193.  
  194. }
  195.  
  196. ///===========================================
  197. /// Ñîðòèðîâêà äëÿ ïåðåìåííûõ òèïà unsigned char (1 áàéò)
  198. ///===========================================
  199.  
  200. void qsuc(unsigned char *a, int n)
  201. {
  202.  
  203. int i, j;
  204. unsigned char temp, p;
  205.  
  206. p = *(a+(n>>1));
  207.  
  208. i = 0;
  209. j = n;
  210.  
  211. do
  212.         {
  213.         while ( *(a+i) < p ) i++;
  214.         while ( *(a+j) > p ) j--;
  215.  
  216.         if (i <= j)
  217.                 {
  218.                 temp = *(a+i);
  219.                 *(a+i) = *(a+j);
  220.                 *(a+j) = temp;
  221.                 i++;
  222.                 j--;
  223.                 }
  224.         } while ( i<=j );
  225.  
  226. if ( j > 0 )
  227.         qsuc(a, j);
  228. if ( n > i )
  229.         qsuc(a+i, n-i);
  230.  
  231. }
  232.  
  233.  
  234. ///===========================================
  235. /// Ñîðòèðîâêà äëÿ ïåðåìåííûõ òèïà float (4 áàéòà)
  236. ///===========================================
  237.  
  238. void qsf(float *a, int n)
  239. {
  240.  
  241. int i, j;
  242. float temp, p;
  243.  
  244. p = *(a+(n>>1));
  245.  
  246. i = 0;
  247. j = n;
  248.  
  249. do
  250.         {
  251.         while ( *(a+i) < p ) i++;
  252.         while ( *(a+j) > p ) j--;
  253.  
  254.         if (i <= j)
  255.                 {
  256.                 temp = *(a+i);
  257.                 *(a+i) = *(a+j);
  258.                 *(a+j) = temp;
  259.                 i++;
  260.                 j--;
  261.                 }
  262.         } while ( i<=j );
  263.  
  264. if ( j > 0 )
  265.         qsf(a, j);
  266. if ( n > i )
  267.         qsf(a+i, n-i);
  268.  
  269. }
  270.  
  271. ///===========================================
  272. /// Ñîðòèðîâêà äëÿ ïåðåìåííûõ òèïà double (8 áàéò)
  273. ///===========================================
  274.  
  275. void qsd(double *a, int n)
  276. {
  277.  
  278. int i, j;
  279. double temp, p;
  280.  
  281. p = *(a+(n>>1));
  282.  
  283. i = 0;
  284. j = n;
  285.  
  286. do
  287.         {
  288.         while ( *(a+i) < p ) i++;
  289.         while ( *(a+j) > p ) j--;
  290.  
  291.         if (i <= j)
  292.                 {
  293.                 temp = *(a+i);
  294.                 *(a+i) = *(a+j);
  295.                 *(a+j) = temp;
  296.                 i++;
  297.                 j--;
  298.                 }
  299.         } while ( i<=j );
  300.  
  301. if ( j > 0 )
  302.         qsd(a, j);
  303. if ( n > i )
  304.         qsd(a+i, n-i);
  305.  
  306. }
  307.  
  308. ///===========================================
  309.  
  310.  
  311. #define NULL ((void*)0)
  312.  
  313. typedef struct
  314. {
  315. void    *name;
  316. void    *function;
  317. } export_t;
  318.  
  319. char    szQsi[] = "qsi";
  320. char    szQss[] = "qss";
  321. char    szQsc[] = "qsc";
  322. char    szQsui[] = "qsui";
  323. char    szQsus[] = "qsus";
  324. char    szQsuc[] = "qsuc";
  325. char    szQsf[] = "qsf";
  326. char    szQsd[] = "qsd";
  327.  
  328. export_t EXPORTS[] =
  329. {
  330. { szQsi, (void*) qsi },
  331. { szQss, (void*) qss },
  332. { szQsc, (void*) qsc },
  333. { szQsui, (void*) qsui },
  334. { szQsus, (void*) qsus },
  335. { szQsuc, (void*) qsuc },
  336. { szQsf, (void*) qsf },
  337. { szQsd, (void*) qsd },
  338. { NULL, NULL },
  339. };
  340.