C# 排序

将前面写的几个排序算法整理了一个,合在一起。

1.适合于实现了IComparable接口的任何类型的数组

2.这个类可以当成一个工具类

3.以后如果实现了其他的排序算法还会再加进来,目前有直接插入排序希尔排序冒泡排序快速排序选择排序。其中冒泡和选择比较简单,

  希尔和快速排序比较复杂,都用上递归了。

/// <summary>
/// Dec:Sort Helper
/// Author:david
/// Create Date:2010-05-06
/// </summary>
public class SortHelper
{
/// <summary>
/// Insert Sort
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="array"></param>
public static void InsertSort<T>(T[] array) where T : IComparable
{
int length = array.Length;
for (int i = 1; i < length; i++)
{
T temp
= array[i];
if (temp.CompareTo(array[i - 1])<0)
{
for (int j = 0; j < i; j++)
{
if (temp.CompareTo(array[j])<0)
{
temp
= array[j];
array[j]
= array[i];
array[i]
= temp;
}
}
}
}
}
/// <summary>
/// Shell Sort
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="array"></param>
public static void ShellSort<T>(T[] array) where T : IComparable
{
int length = array.Length;
for (int h = length / 2; h > 0; h = h / 2)
{
for (int i = h; i < length; i++)
{
T temp
= array[i];
if (temp.CompareTo(array[i -h]) < 0)
{
for (int j = 0; j < i; j += h)
{
if (temp.CompareTo(array[j]) < 0)
{
temp
= array[j];
array[j]
= array[i];
array[i]
= temp;
}
}
}
}
}
}
/// <summary>
/// Bubble Sort
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="array"></param>
public static void BubbleSort<T>(T[] array) where T : IComparable
{
int length = array.Length;
for (int i = 0; i < length; i++)
{
T temp
= array[i];
for (int j = i; j < length; j++)
{
if (temp.CompareTo(array[j]) >0)
{
temp
= array[j];
array[j]
= array[i];
array[i]
= temp;
}
}
}
}
/// <summary>
/// Quick Sort
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="array"></param>
public static void QuickSort<T>(T[] array,int left,int right) where T : IComparable
{

if (left < right)
{

int middle = GetMiddleFroQuickSort<T>(array, left, right);

 

QuickSort<T>(array, left, middle - 1);

QuickSort<T>(array, middle + 1, right);
}

}
/// <summary>
/// get the index of the middle value for qucik sort
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="array"></param>
/// <param name="left"></param>
/// <param name="right"></param>
/// <returns></returns>
private static int GetMiddleFroQuickSort<T>(T[] array, int left, int right) where T : IComparable
{
T key
= array[left];
while (left < right)
{
while (left < right && key.CompareTo(array[right]) < 0)
{
right
--;
}
if (left < right)
{
T temp
= array[left];
array[left]
= array[right];
//Console.WriteLine("array[{0}]:{1} ----> arry[{2}]:{3}", left, temp, right, array[right]);
left++;
}

while (left < right && key.CompareTo(array[left]) > 0)
{
left
++;
}
if (left < right)
{
T temp
= array[right];
array[right]
= array[left];
//Console.WriteLine("array[{0}]:{1} ----> arry[{2}]:{3}", right, temp, left, array[left]);
right--;
}
array[left]
= key;
}
//Console.WriteLine("find the middle value {0} and the index {1}", array[left], left);
return left;
}
/// <summary>
/// selection sort
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="array"></param>
/// <param name="left"></param>
/// <param name="right"></param>
public static void SelectionSort<T>(T[] array) where T : IComparable
{
int length = array.Length;
for (int i = 0; i < length; i++)
{
T min
= array[i];
int minIndex = i ;
for (int j = i+1; j < length; j++)
{
if (min.CompareTo(array[j])>0)
{
min
= array[j];
minIndex
= j;
}
}
if (minIndex != i)
{
array[minIndex]
= array[i];
array[i]
= min;
//Console.WriteLine("the min value is : {2} swap {0} with {1}", array[minIndex], array[i],min);
}
//for (int k = 0; k <=i; k++)
//{
// Console.Write(array[k] + "->");
//}
//Console.WriteLine();
//Console.WriteLine();
}
}
}

posted @ 2010-05-10 17:34  rob_2010  阅读(146)  评论(0)    收藏  举报