diff --git a/Objects/listobject.c b/Objects/listobject.c
index 33ebe81..a985aa3 100644
--- a/Objects/listobject.c
+++ b/Objects/listobject.c
@@ -609,19 +609,20 @@
 	object *compare;/* Comparison function object, or NULL for default */
 {
 	register object **a = array;
-	register int i;
+	register object **end = array+size;
+	register object **p;
 
-	for (i = 1; i < size; i++) {
-		register object *key = a[i];
-		register int j = i;
-		while (--j >= 0) {
-			register int k = docompare(a[j], key, compare);
+	for (p = a+1; p < end; p++) {
+		register object *key = *p;
+		register object **q = p;
+		while (--q >= a) {
+			register int k = docompare(*q, key, compare);
 			if (k == CMPERROR)
 				return -1;
 			if (k <= 0)
 				break;
-			a[j+1] = a[j];
-			a[j] = key; /* For consistency */
+			*(q+1) = *q;
+			*q = key; /* For consistency */
 		}
 	}
 
@@ -629,7 +630,9 @@
 }
 
 /* MINSIZE is the smallest array we care to partition; smaller arrays
-   are sorted using a straight insertion sort (above). */
+   are sorted using a straight insertion sort (above).  You may want
+   to play with this to tune it for your system.  It must be at least
+   2; more than 20 probably doesn't make sense. */
 #define MINSIZE 10
 
 /* STACKSIZE is the size of our work stack.  A rough estimate is that
@@ -649,64 +652,66 @@
 	int size;	/* Number of elements to sort */
 	object *compare;/* Comparison function object, or NULL for default */
 {
-	register object **a, *tmp, *pivot;
-	register int n, l, r, k;
-	int top, i, j, n2;
-	object **astack[STACKSIZE];
-	int nstack[STACKSIZE];
+	register object *tmp, *pivot;
+	register object **lo, **hi, **l, **r;
+	int top, k, n, n2;
+	object **lostack[STACKSIZE];
+	object **histack[STACKSIZE];
 
 	/* Start out with the whole array on the work stack */
-	astack[0] = array;
-	nstack[0] = size;
+	lostack[0] = array;
+	histack[0] = array+size;
 	top = 1;
 
 	/* Repeat until the work stack is empty */
 	while (--top >= 0) {
-		a = astack[top];
-		n = nstack[top];
+		lo = lostack[top];
+		hi = histack[top];
 
 		/* If it's a small one, use straight insertion sort */
+		n = hi - lo;
 		if (n < MINSIZE) {
-			if (insertionsort(a, n, compare) < 0)
+			if (insertionsort(lo, n, compare) < 0)
 				return -1;
 			continue;
 		}
 
-		/* Choose median of a[0], a[n/2], a[n-1] as pivot */
-		i = n>>1;
-		j = n-1;
-		k = docompare(a[0], a[i], compare);
+		/* Choose median of first, middle and last item as pivot */
+		
+		l = lo + (n>>1); /* Middle */
+		r = hi - 1;	/* Last */
+		k = docompare(*lo, *l, compare);
 		if (k == CMPERROR)
 			return -1;
 		if (k < 0)
-			{ tmp = a[0]; a[0] = a[i]; a[i] = tmp; }
-		k = docompare(a[j], a[i], compare);
+			{ tmp = *lo; *lo = *l; *l = tmp; }
+		k = docompare(*r, *l, compare);
 		if (k == CMPERROR)
 			return -1;
 		if (k < 0)
-			{ tmp = a[j]; a[j] = a[i]; a[i] = tmp; }
-		k = docompare(a[j], a[0], compare);
+			{ tmp = *r; *r = *l; *l = tmp; }
+		k = docompare(*r, *lo, compare);
 		if (k == CMPERROR)
 			return -1;
 		if (k < 0)
-			{ tmp = a[j]; a[j] = a[0]; a[0] = tmp; }
-		pivot = a[0];
+			{ tmp = *r; *r = *lo; *lo = tmp; }
+		pivot = *lo;
 
 		/* Partition the array */
-		l = 0;
-		r = n;
+		l = lo;
+		r = hi;
 		for (;;) {
 			/* Move left index to element > pivot */
-			while (++l < n) {
-				k = docompare(a[l], pivot, compare);
+			while (++l < hi) {
+				k = docompare(*l, pivot, compare);
 				if (k == CMPERROR)
 					return -1;
 				if (k > 0)
 					break;
 			}
 			/* Move right index to element < pivot */
-			while (--r > 0) {
-				k = docompare(a[r], pivot, compare);
+			while (--r > lo) {
+				k = docompare(*r, pivot, compare);
 				if (k == CMPERROR)
 					return -1;
 				if (k < 0)
@@ -716,40 +721,41 @@
 			if (r < l)
 				break;
 			/* Swap elements and continue */
-			{ tmp = a[l]; a[l] = a[r]; a[r] = tmp; }
+			{ tmp = *l; *l = *r; *r = tmp; }
 		}
 
 		/* Move the pivot into the middle */
-		{ tmp = a[0]; a[0] = a[r]; a[r] = tmp; }
+		{ tmp = *lo; *lo = *r; *r = tmp; }
 
 		/* We have now reached the following conditions:
-			0 <= r < l <= n
-			all x in a[0:r] are <= pivot
-			all x in a[r:l] are == pivot
-			all x in a[l:n] are >= pivot
-		   The partitions are a[0:r] and a[l:n]
+			lo <= r < l <= hi
+			all x in [lo,r) are <= pivot
+			all x in [r,l)  are == pivot
+			all x in [l,hi) are >= pivot
+		   The partitions are [lo,r) and [l,hi)
 		 */
 
 		/* Push biggest partition first */
-		n2 = n - l;
-		if (r > n2) {
+		n = r - lo;
+		n2 = hi - l;
+		if (n > n2) {
 			/* First one is bigger */
-			if (r > 1) {
-				astack[top] = a;
-				nstack[top++] = r;
+			if (n > 1) {
+				lostack[top] = lo;
+				histack[top++] = r;
 				if (n2 > 1) {
-					astack[top] = a+l;
-					nstack[top++] = n2;
+					lostack[top] = l;
+					histack[top++] = hi;
 				}
 			}
 		} else {
 			/* Second one is bigger */
 			if (n2 > 1) {
-				astack[top] = a+l;
-				nstack[top++] = n2;
-				if (r > 1) {
-					astack[top] = a;
-					nstack[top++] = r;
+				lostack[top] = l;
+				histack[top++] = hi;
+				if (n > 1) {
+					lostack[top] = lo;
+					histack[top++] = r;
 				}
 			}
 		}
