class Program
{
static void Main(string[] args)
{
int[] a = new int[] { 49, 38, 65, 97, 76, 13, 27 };
int[] b = new int[] { 49, 38, 65, 97, 76, 13, 27 };
QuickSort s = new QuickSort();
s.Sort(a);
foreach (int ai in a)
{
Console.Write(ai.ToString() + ",");
}
Console.WriteLine("Quick Sort's Partition time =" + s.PartitionTime);
RandomQuickSort rs = new RandomQuickSort();
rs.Sort(b);
foreach (int bi in b)
{
Console.Write(bi.ToString() + ",");
}
Console.WriteLine("Random Quick Sort's Partition time =" + rs.PartitionTime);
Console.Read();
}
}
public class QuickSort
{
private int _partitionTime;
public int PartitionTime
{
get { return _partitionTime; }
}
public void Sort(int[] data)
{
Sort(data, 0, data.Length - 1);
}
private void Sort(int[] data, int low, int high)
{
if (low >= high)
return;
int p = Partition(data, low, high);
Sort(data, low, p - 1);
Sort(data, p + 1, high);
}
protected virtual int Partition(int[] data, int low, int high)
{
_partitionTime++;
int key = data[low];
int i = low;
int j = high;
while (i < j)
{
while(data[j]>= key && j>i)
{
j--;
}
data[i] = data[j];
while (data[i] <= key && i < j)
{
i++;
}
data[j] = data[i];
}
data[i] = key;
return i;
}
}
public class RandomQuickSort : QuickSort
{
protected override int Partition(int[] data, int low, int high)
{
Random r = new Random();
int pivot = r.Next(low, high);
int tmp = data[low];
data[low] = data[pivot];
data[pivot] = tmp;
return base.Partition(data, low, high);
}
}