quicksor.c
上传用户:dgyhgb
上传日期:2007-01-07
资源大小:676k
文件大小:3k
源码类别:

SQL Server

开发平台:

Unix_Linux

  1. /*  quicksor.c - Quick sort
  2.  *               Kernel of GNU SQL-server. Sorter     
  3.  *
  4.  *  This file is a part of GNU SQL Server
  5.  *
  6.  *  Copyright (c) 1996, 1997, Free Software Foundation, Inc
  7.  *  Developed at the Institute of System Programming
  8.  *  This file is written by  Vera Ponomarenko
  9.  *
  10.  *  This program is free software; you can redistribute it and/or modify
  11.  *  it under the terms of the GNU General Public License as published by
  12.  *  the Free Software Foundation; either version 2 of the License, or
  13.  *  (at your option) any later version.
  14.  *
  15.  *  This program is distributed in the hope that it will be useful,
  16.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  *  GNU General Public License for more details.
  19.  *
  20.  *  You should have received a copy of the GNU General Public License
  21.  *  along with this program; if not, write to the Free Software
  22.  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  23.  *
  24.  *  Contacts:   gss@ispras.ru
  25.  *
  26.  */
  27. /* $Id: quicksor.c,v 1.245 1997/03/31 03:46:38 kml Exp $ */
  28. #include "dessrt.h"
  29. #include "fdclsrt.h"
  30. extern i4_t N;
  31. extern char *nonsense;
  32. extern char **regpkr;
  33. void
  34. quicksort(i4_t M, char prdbl, char *drctn, u2_t *afn, struct des_field *df)
  35. {
  36.   i4_t bstek[STEKSZ];
  37.   i4_t *stek, l, r, i, i1, j, v = 0, d1, d2;
  38.   char **ptp, *curpk;
  39.   ptp = regpkr;
  40.   stek = bstek;
  41.   for (l = 0, r = N - 1;;)
  42.     {
  43.       if ((r - l) < M)
  44. { /* The simple insertion sort */
  45.   if (prdbl == NODBL)
  46.     for (j = l; j <= r; j++) /* nonsense referense deletion */
  47.       if (ptp[j] == nonsense)
  48. {
  49.   for (i = j; i < r; i++)
  50.     ptp[i] = ptp[i + 1];
  51.   ptp[r--] = nonsense;
  52. }
  53.   for (j = l + 1; j <= r; j++)
  54.     {
  55.       curpk = ptp[j];
  56.       for (i = j - 1; i >= l;)
  57. {
  58.   if ((v = cmpkey (afn, df, drctn, curpk, ptp[i])) < 0)
  59.     {
  60.       ptp[i + 1] = ptp[i];
  61.       i--;
  62.     }
  63.   else if (v == 0 && prdbl == NODBL)
  64.     {
  65.       for (i1 = i; i1 > l; i1--)
  66. ptp[i1] = ptp[i1 - 1];
  67.       ptp[l++] = nonsense;
  68.     }
  69.   else
  70.     break;
  71. }
  72.       ptp[i + 1] = curpk;
  73.     }
  74.   if (stek == bstek)
  75.     break;
  76.   r = *(--stek);
  77.   l = *(--stek);
  78.   continue;
  79. }
  80.       i = l; /* quicksort */
  81.       j = r;
  82.       curpk = ptp[l];
  83.     m1:
  84.       for (; i < j; j--)
  85. if ((v = cmpkey (afn, df, drctn, curpk, ptp[j])) >= 0)
  86.   break;
  87.       if (v == 0 && i < j && prdbl == NODBL)
  88. {
  89.   ptp[j] = nonsense;
  90.   j--;
  91.   goto m1;
  92. }
  93.       if (i >= j)
  94. {
  95.   ptp[i] = curpk;
  96.   goto m3;
  97. }
  98.       ptp[i++] = ptp[j];
  99.     m2:
  100.       for (; i < j; i++)
  101. if ((v = cmpkey (afn, df, drctn, ptp[i], curpk)) >= 0)
  102.   break;
  103.       if (v == 0 && i < j && prdbl == NODBL)
  104. {
  105.   ptp[i] = nonsense;
  106.   i++;
  107.   goto m2;
  108. }
  109.       if (i < j)
  110. {
  111.   ptp[j] = ptp[i];
  112.   j--;
  113.   goto m1;
  114. }
  115.       ptp[j] = curpk;
  116.       i = j;
  117.     m3:
  118.       d1 = i - l;
  119.       d2 = r - i;
  120.       if (d1 < 2)
  121. {
  122.   l += d1 + 1;
  123.   continue;
  124. }
  125.       if (d2 < 2)
  126. {
  127.   r -= d2 + 1;
  128.   continue;
  129. }
  130.       if (d1 <= d2)
  131. {
  132.   *stek++ = i + 1;
  133.   *stek++ = r;
  134.   r = i - 1;
  135. }
  136.       else
  137. {
  138.   *stek++ = l;
  139.   *stek++ = i - 1;
  140.   l = i + 1;
  141. }
  142.     }
  143. }