Beispiel #1
0
Datei: psort.c Projekt: BWK/os161
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);
}
Beispiel #2
0
Datei: psort.c Projekt: BWK/os161
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);
	}
}
Beispiel #3
0
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");
}