Actual source code: sortd.c

```  1: #define PETSC_DLL
2: /*
3:    This file contains routines for sorting doubles.  Values are sorted in place.
4:    These are provided because the general sort routines incur a great deal
5:    of overhead in calling the comparision routines.

7:  */
8:  #include petsc.h
9:  #include petscsys.h

11: #define SWAP(a,b,t) {t=a;a=b;b=t;}
12:
15: /* A simple version of quicksort; taken from Kernighan and Ritchie, page 87 */
16: static PetscErrorCode PetscSortReal_Private(PetscReal *v,PetscInt right)
17: {
18:   PetscInt  i,last;
19:   PetscReal vl,tmp;
20:
22:   if (right <= 1) {
23:     if (right == 1) {
24:       if (v[0] > v[1]) SWAP(v[0],v[1],tmp);
25:     }
26:     return(0);
27:   }
28:   SWAP(v[0],v[right/2],tmp);
29:   vl   = v[0];
30:   last = 0;
31:   for (i=1; i<=right; i++) {
32:     if (v[i] < vl) {last++; SWAP(v[last],v[i],tmp);}
33:   }
34:   SWAP(v[0],v[last],tmp);
35:   PetscSortReal_Private(v,last-1);
36:   PetscSortReal_Private(v+last+1,right-(last+1));
37:   return(0);
38: }

42: /*@
43:    PetscSortReal - Sorts an array of doubles in place in increasing order.

45:    Not Collective

47:    Input Parameters:
48: +  n  - number of values
49: -  v  - array of doubles

51:    Level: intermediate

53:    Concepts: sorting^doubles

55: .seealso: PetscSortInt(), PetscSortRealWithPermutation()
56: @*/
57: PetscErrorCode  PetscSortReal(PetscInt n,PetscReal v[])
58: {
59:   PetscInt  j,k;
60:   PetscReal tmp,vk;

63:   if (n<8) {
64:     for (k=0; k<n; k++) {
65:       vk = v[k];
66:       for (j=k+1; j<n; j++) {
67:         if (vk > v[j]) {
68:           SWAP(v[k],v[j],tmp);
69:           vk = v[k];
70:         }
71:       }
72:     }
73:   } else {
74:     PetscSortReal_Private(v,n-1);
75:   }
76:   return(0);
77: }

```