#include #include int linearMedian(int* a,int n, int k) { // pick random value int r = a[n/2]; int sl = 0; int sk = 0; int sr = 0; int *asl = (int*)malloc(n*sizeof(int)); int *ask = (int*)malloc(n*sizeof(int)); int *asr = (int*)malloc(n*sizeof(int)); int i; for (i = 0; i < n; i++) { if (a[i] < r) { asl[sl] = a[i]; sl++; } else if (a[i] == r) { ask[sk] = a[i]; sk++; } else { asr[sr] = a[i]; sr++; } // resort the numbers } if ( (k+1) <= sl) return linearMedian(asl, sl, k); else if (sl < (k+1) && (sl + sk) >= (k+1)) return ask[sk-1]; else return linearMedian(asr, (sr), (k) - (sl+sk)); } int main() { int *a = (int*)malloc(13*sizeof(int)); a[0] = 0; a[1] = 1; a[2] = 2; a[3] = 3; a[4] = 4; a[5] = 5; a[6] = 6; a[7] = 7; a[8] = 8; a[9] = 9; a[10] = 10; a[11] = 11; a[12] = 12; int i; for (i = 0; i < 13; i++) printf("Found median: %d\n", linearMedian(a, 13, i)); }