[ create a new paste ] login | about

Link: http://codepad.org/FEvad3aP    [ raw code | output | fork ]

olnrao - C, pasted on Nov 6:
#include <stdio.h>
 
double FindMedian(int n, int *a);
 
int main(int argc, char* args[])
{
    double median;
    printf("\n\nMain ...\n\n");
    int x[3][3] = 
    {
       {1, 2, 3}, 
       {100, 10000, 20000}, 
       {1000, 30000, 40000}
    };

    int y[4][4] = 
    {
       {10, 20, 30, 40}, 
       {100, 10000, 20000, 30000}, 
       {1000, 30000, 35000, 40000},
       {10000, 35000, 40000, 45000}
    };

    median = FindMedian(3, (int *) x);
    printf("\nMedian : %lf\n", median);

    median = FindMedian(4, (int *) y);
    printf("\nMedian : %lf\n", median);

    return 0;
}

int GetMedianValue(int m, int mix, int six, int value, int *pfQuit)
{
    if (six == mix) 
    {
        printf("*");
        return value;
    }

    if (m % 2 == 0 && six == mix + 1)
    {
        *pfQuit = 1;
        printf("*");
        return value;
    }

    return 0;
}

double FindMedian(int n, int *a)
{
    int i, j, r, c;
    int six = 0; // Sorted Index Number
    int sixr, sixc;
    const int m = n * n;
    const int mix = (m + 1) >> 1; // Median Index Number
    long median = 0;
    int fQuit = 0;

    printf("\n\n\nNumber Of Elements = %d, Median Index = %d", m, mix);

    printf("\n\nMatrix : \n");

    for (i = 0; i < n; i++)
    {
        printf("\n");
        for (j = 0; j < n; j++)
        {
            printf("%d, \t\t", a[i*n + j]);
        }
    }

    printf("\n\nSequence : "); 
    for (i = 0; i < (n + 1)/ 2 && !fQuit; i++)
    {
        sixr = sixc = i; six++;
        median += GetMedianValue(m, mix, six, a[sixr*n + sixc], &fQuit);
        printf("%d, ", a[sixr*n + sixc]); 
        if (fQuit) break;
        for (r = i + 1, c = i + 1; r < n && c < n;)
        {
            if (a[i*n + c] < a[r*n + i])
            {
                six++;
                sixc = c++;
                median += GetMedianValue(m, mix, six, a[sixr*n + sixc], &fQuit);
                printf("%d, ", a[sixr*n + sixc]);
                if (fQuit) break;
            }
            else
            {
                six++;
                sixr = r++;
                median += GetMedianValue(m, mix, six, a[sixr*n + sixc], &fQuit);
                printf("%d, ", a[sixr*n + sixc]);
                if (fQuit) break;
            }
        }

        while (c < n && !fQuit)
        {
            six++;
            sixc = c++;
            median += GetMedianValue(m, mix, six, a[i*n + sixc], &fQuit);
            printf("%d, ", a[i*n + sixc]);
        }

        while(r < n && !fQuit)
        {
            six++;
            sixr = r++;
            median += GetMedianValue(m, mix, six, a[sixr*n + i], &fQuit);
            printf("%d, ", a[sixr*n + i]);
        }
    }

    return (m % 2 == 0) ? median / 2 : median;
}


Output:


Main ...




Number Of Elements = 9, Median Index = 5

Matrix : 

1, 		2, 		3, 		
100, 		10000, 		20000, 		
1000, 		30000, 		40000, 		

Sequence : 1, 2, 3, 100, *1000, 10000, 20000, 30000, 
Median : 1000.000000



Number Of Elements = 16, Median Index = 8

Matrix : 

10, 		20, 		30, 		40, 		
100, 		10000, 		20000, 		30000, 		
1000, 		30000, 		35000, 		40000, 		
10000, 		35000, 		40000, 		45000, 		

Sequence : 10, 20, 30, 40, 100, 1000, 10000, *10000, *20000, 
Median : 15000.000000


Create a new paste based on this one


Comments: