static void sortints(int *v, int num) { int pivotval, pivotpoint, pivotcount; int frontpos, readpos, endpos, i, j; int tmp; if (num < 2) { return; } pivotpoint = num/2; pivotval = v[pivotpoint]; pivotcount = 0; frontpos = 0; readpos = 0; endpos = num; while (readpos < endpos) { if (v[readpos] < pivotval) { v[frontpos++] = v[readpos++]; } else if (v[readpos] == pivotval) { readpos++; pivotcount++; } else { tmp = v[--endpos]; v[endpos] = v[readpos]; v[readpos] = tmp; } } assert(readpos == endpos); assert(frontpos + pivotcount == readpos); for (i=frontpos; i<endpos; i++) { v[i] = pivotval; } for (i=endpos, j=num-1; i<j; i++,j--) { tmp = v[i]; v[i] = v[j]; v[j] = tmp; } sortints(v, frontpos); sortints(&v[endpos], num-endpos); }
static void sortbins(void) { const char *name; int i, fd; off_t binsize; for (i=0; i<numprocs; i++) { name = binname(me, i); binsize = getsize(name); if (binsize % sizeof(int) != 0) { complainx("%s: bin size %ld no good", name, (long) binsize); exit(1); } if (binsize > (off_t) sizeof(workspace)) { complainx("proc %d: %s: bin too large", me, name); exit(1); } fd = doopen(name, O_RDWR, 0); doexactread(name, fd, workspace, binsize); sortints(workspace, binsize/sizeof(int)); dolseek(name, fd, 0, SEEK_SET); dowrite(name, fd, workspace, binsize); doclose(name, fd); } }
void chart(int argc, char* argv[]) { int counts[RANGE] = {0}; int i; printf("\n"); for(i = 1; i < argc; i++) { int temp = atoi(argv[i]); int index = sortints(temp, 16); counts[index] = counts[index] + 1; } for (i = 0; i < 16; i++) { //printf("counts[%d]: %d\n",i,counts[i]); char in = counts[i]; print(i*16, (i+1)*16-1 ,in , argc-1); } printf("\n"); }