? arraylist.diff
? listwrapper.diff
Index: ArrayList.cs
===================================================================
RCS file: /mono/mcs/class/corlib/System.Collections/ArrayList.cs,v
retrieving revision 1.42
diff -r1.42 ArrayList.cs
319,320c319,321
< 			[MonoTODO]
< 			public override void Sort () {
---
> 			public override void Sort ()
> 			{
> 				QuickSort(this, 0, count - 1, Comparer.Default);
323,324c324,326
< 			[MonoTODO]
< 			public override void Sort (IComparer comparer) {
---
> 			public override void Sort (IComparer comparer)
> 			{
> 				QuickSort(this, 0, count - 1, comparer);
327,328c329,423
< 			[MonoTODO]
< 			public override void Sort (int index, int count, IComparer comparer) {
---
> 			public override void Sort (int index, int count, IComparer comparer)
> 			{
> 				QuickSort(this, index, index + count, comparer);
> 			}
> 
> 			/// <summary>
> 			/// Swaps two items in a list at the specified indexes.
> 			/// </summary>
> 			private static void Swap(IList list, int x, int y)
> 			{
> 				object tmp;
> 				
> 				tmp = list[x];
> 				list[x] = list[y];
> 				list[y] = tmp;
> 			}
> 
> 			/// <summary>
> 			/// Quicksort for lists.
> 			/// </summary>
> 			/// <remarks>
> 			/// This function acts as both qsort() and partition().
> 			/// </remarks>
> 			private static void QuickSort(IList list, int left, int right, IComparer comparer)
> 			{
> 				int i, j, middle;
> 				object pivot;
> 					
> 				if (left >= right)
> 				{
> 					return;
> 				}
> 
> 				// Pick the pivot using the median-of-three strategy.
> 
> 				middle = (left + right) / 2;
> 
> 				if (comparer.Compare(list[middle], list[left]) < 0)
> 				{
> 					Swap(list, middle, left);
> 				}
> 
> 				if (comparer.Compare(list[right], list[left]) < 0)
> 				{
> 					Swap(list, right, left);
> 				}
> 
> 				if (comparer.Compare(list[right], list[middle]) < 0)
> 				{
> 					Swap(list, right, middle);
> 				}
> 		
> 				if (right - left + 1 <= 3)
> 				{
> 					return;
> 				}
> 		
> 				// Put the pivot in right - 1.
> 
> 				Swap(list, right - 1, middle);
> 
> 				// List should look like:
> 				//
> 				// [Small] ..Numbers.. [Middle] ..Numbers.. [Pivot][Large]
> 
> 				pivot = list[right - 1];
> 
> 				// Sort from (left + 1) to (right - 2).
> 
> 				i = left;
> 				j = right - 1;			
> 		
> 				for (;;)
> 				{
> 					while (comparer.Compare(list[++i], pivot) < 0);
> 					while (comparer.Compare(list[--j], pivot) > 0);
> 			
> 					if (i < j)
> 					{
> 						Swap(list, i, j);
> 					}
> 					else
> 					{
> 						break;
> 					}
> 				}
> 
> 				// Put pivot into the right position (real middle).
> 
> 				Swap(list, right - 1, i);
> 
> 				// Recursively sort the left and right sub lists.
> 
> 				QuickSort(list, left, i - 1, comparer);
> 				QuickSort(list, i + 1, right, comparer);		
Index: ChangeLog
===================================================================
RCS file: /mono/mcs/class/corlib/System.Collections/ChangeLog,v
retrieving revision 1.66
diff -r1.66 ChangeLog
0a1,3
> 2003-04-06  Thong Nguyen <tum@veridicus.com>
> 	* ArrayList.cs:  Added implementation for ListWrapper.Sort.
> 
