modernc.org/ccgo/v3@v3.16.14/lib/testdata/CompCert-3.6/test/c/qsort.c (about)

     1  #include <stdlib.h>
     2  #include <stdio.h>
     3  #include <string.h>
     4  
     5  void quicksort(int lo, int hi, int base[])
     6  { 
     7    int i,j;
     8    int pivot,temp;
     9      
    10    if (lo<hi) {
    11      for (i=lo,j=hi,pivot=base[hi];i<j;) {
    12        while (i<hi && base[i]<=pivot) i++;
    13        while (j>lo && base[j]>=pivot) j--;
    14        if (i<j) { temp=base[i]; base[i]=base[j]; base[j]=temp; }
    15      }
    16      temp=base[i]; base[i]=base[hi]; base[hi]=temp;
    17      quicksort(lo,i-1,base);  quicksort(i+1,hi,base);
    18    }
    19  }
    20  
    21  int cmpint(const void * i, const void * j)
    22  {
    23    int vi = *((int *) i);
    24    int vj = *((int *) j);
    25    if (vi == vj) return 0;
    26    if (vi < vj) return -1;
    27    return 1;
    28  }
    29  
    30  #define NITER 10
    31  
    32  int main(int argc, char ** argv)
    33  {
    34    int n, i, j;
    35    int * a, * b;
    36  
    37    if (argc >= 2) n = atoi(argv[1]); else n = 100000;
    38    a = malloc(n * sizeof(int));
    39    b = malloc(n * sizeof(int));
    40    for (j = 0; j < NITER; j++) {
    41      for (i = 0; i < n; i++) b[i] = a[i] = rand() & 0xFFFF;
    42      quicksort(0, n - 1, a);
    43    }
    44    qsort(b, n, sizeof(int), cmpint);
    45    for (i = 0; i < n; i++) {
    46      if (a[i] != b[i]) { printf("Bug!\n"); return 2; }
    47    }
    48    printf("OK\n");
    49    return 0;
    50  }