Пример #1
0
int find_median(int *data, int l, int r, int sz) {
	int groups_cnt = (r-l+1)/5;
	printf("groups_cnt=%d, l=%d, r=%d\n", groups_cnt, l, r);
	print_data("before compute 5", data, sz);
	for (int j = 0; j < groups_cnt; j++) {
		swap_ints(data, l+j, compute_median_of_five(data, l + 5*j));
		/*data[l+j] = compute_median_of_five(data, l + 5*j);*/
		printf("start = %d, ", l+5*j);
		print_data("after compute 5", data, sz);
	}
	return select_median(data, l, l + groups_cnt, groups_cnt/2);
}
Пример #2
0
int
main(int    argc,
     char * argv[]) {

    struct cmdlineInfo cmdline;
    FILE * ifP;
    int cols, rows;
    int median;
    enum medianMethod medianMethod;

    pgm_init(&argc, argv);

    parseCommandLine(argc, argv, &cmdline);
    
    ifP = pm_openr(cmdline.inputFileName);

    ccolso2 = cmdline.width / 2;
    crowso2 = cmdline.height / 2;

    pgm_readpgminit(ifP, &cols, &rows, &maxval, &format);
    pgm_writepgminit(stdout, cols, rows, maxval, forceplain);

    /* Allocate space for number of rows in mask size. */
    grays = pgm_allocarray(cols, cmdline.height);
    grayrow = pgm_allocrow(cols);

    /* Allocate pointers to mask row buffer. */
    rowptr = (gray **) pm_allocrow(cmdline.height, sizeof(gray *));

    /* Read in and write out initial rows that won't get changed. */
    for (row = 0; row < cmdline.height - 1; ++row) {
        pgm_readpgmrow(ifP, grays[row], cols, maxval, format);
        /* Write out the unchanged row. */
        if (row < crowso2)
            pgm_writepgmrow(stdout, grays[row], cols, maxval, forceplain);
    }

    median = (cmdline.height * cmdline.width) / 2;

    /* Choose which sort to run. */
    if (cmdline.type == MEDIAN_UNSPECIFIED) {
        if ((maxval / ((cmdline.width * cmdline.height) - 1)) < cmdline.cutoff)
            medianMethod = HISTOGRAM_SORT_MEDIAN;
        else
            medianMethod = SELECT_MEDIAN;
    } else
        medianMethod = cmdline.type;

    switch (medianMethod) {
    case SELECT_MEDIAN:
        select_median(ifP, cmdline.width, cmdline.height, cols, rows, median);
        break;
        
    case HISTOGRAM_SORT_MEDIAN:
        histogram_sort_median(ifP, cmdline.width, cmdline.height,
                              cols, rows, median);
        break;
    case MEDIAN_UNSPECIFIED:
        pm_error("INTERNAL ERROR: median unspecified");
    }
    
    pm_close(ifP);
    pm_close(stdout);

    pgm_freearray(grays, cmdline.height);
    pgm_freerow(grayrow);
    pm_freerow(rowptr);

    return 0;
}