void batcherSort(
		int ulArrSize,
		int ulStart,
		int ulSkip,
		boolean fHalves) {
		int cnt, ulUpper, ulTemp; /* Utility variables */

		if (ulArrSize < 2) /* No sorting needed if <2 items in the set */
			return;

		if (ulArrSize == 2) {
		/* Do simple compare/swap if there are 2 elements */
			if (work.greater(ulStart,ulStart + ulSkip)) {
				work.swap(ulStart, ulStart+ulSkip);
			}
			c.paintNumbers();
			return;
		}

		ulTemp = 1; /* ulTemp ends up holding the smallest power */
		while (ulTemp < ulArrSize)
			/* of 2 that is at least as big as ulArrSize */
			ulTemp *= 2;

		if (fHalves) /* If the sort was NOT called by the odd/even recurses */ {
			batcherSort((int) (ulTemp / 2), ulStart, ulSkip, true);
			/* Sort 1st half */
			batcherSort((int) (ulArrSize - ulTemp / 2), /* Sort 2nd half */
			 (int) (ulStart + ulTemp / 2 * ulSkip), ulSkip, true);
		}
		batcherSort(
			(int) (ulArrSize - ulArrSize / 2),
			ulStart,
			(int) (ulSkip * 2),
			false);
		/* Sort evens */
		batcherSort(
			(int) (ulArrSize / 2),
			(int) (ulStart + ulSkip),
			(int) (ulSkip * 2),
			false);
		/* Sort odds  */

		ulUpper =
			(int) (ulStart
				+ ulSkip
				+ (ulArrSize - ulArrSize / 2 - 1) * 2 * ulSkip);
		for (cnt = ulStart + ulSkip;
			cnt < ulUpper;
			cnt += ulSkip * 2) /* Do final compares */ {
			if (work.greater(cnt, cnt + ulSkip)) {
				work.swap(cnt, cnt+ulSkip);				
				c.paintNumbers();
			}
		}
		return;
	}