If a permutation P of integers 0 thru n−1 is given as an array P of n distinct integers, each less than n, and for each k<n, P[k] is what k is permuted into, then tp(n, P) is a linear time algorithm to determine the parity of the permutation:
int tp(int n, int P[n]){int p = 0; char v[n];
  for(int j=0; j<n; ++j) v[j] = 0;
  for(int j=0; j<n; ++j)
    if(v[j]) ++p;
    else {int x = j; do {x = P[x]; v[x] = 1;} while (x!=j);}
  return p&1;}

Ocaml routine dp in this program implements this algorithm. If the array is not a permutation this code may loop or exceed array bounds. The following code ensures the preconditions:

#include <stdio.h>
void tc(int n, int P[n]){char v[n];
  for(int j=0; j<n; ++j) v[j] = 0;
  for(int j=0; j<n; ++j)
      {if(P[j]<0 || P[j]>= n) printf("range %d\n", j); v[P[j]] = 1;}
  for(int j=0; j<n; ++j) if(!v[j]) printf("missing %d\n", j);}
The following tests these routines.
#include <stdlib.h>
int main(){int const n=2003; int q[n]; for(int j=0; j<n; ++j) q[j]=j;
   for(int w=1; w<100000; ++w){int i=random()%n; int j; do j=random()%n; while (i==j);
   {int e=q[i]; q[i] = q[j]; q[j] = e;}
   if(!(w&31)) {tc(n, q); if(tp(n, q) != (w&1)) printf("Wrong parity %d\n", w);}}
   return 0;}
All together now