C#实现各种排序
每种排序的要点和实现
文章中参数Func<T, T, bool> comp
的意思是,排序后对于任意i < j
,不可能有comp(list[j], list[i])
冒泡排序
- 每次循环都将最值放到最前或者最后
- 倒着排序,只需访问一次
list.Count
(可选) - 使用
sorted
布尔变量,如果中途已经排序好了就不用继续排了(可选) - 稳定,最值稳定上浮
public static void BubbleSort<T>(IList<T> list)
where T : IComparable<T>
{
for (int i = list.Count; i > 0; i--)
{
bool sorted = true;
for (int j = 1; j < i; j++)
{
if (list[j].CompareTo(list[j - 1]) < 0)
{
T swap = list[j - 1];
list[j - 1] = list[j];
list[j] = swap;
sorted = false;
}
}
if (sorted)
return;
}
}
public static void BubbleSort<T>(IList<T> list, Func<T, T, bool> comp)
{
for (int i = list.Count; i > 0; i--)
{
bool sorted = true;
for (int j = 1; j < i; j++)
{
if (comp(list[j], list[j - 1]))
{
T swap = list[j - 1];
list[j - 1] = list[j];
list[j] = swap;
sorted = false;
}
}
if (sorted)
return;
}
}
选择排序
- 每次都选出未排序段的最值,加入排序段
- 倒着排序,只需访问一次
list.Count
(可选) - 不稳定,最值放入排序段时与最值交换的数位置改变
public static void SelectionSort<T>(IList<T> list)
where T : IComparable<T>
{
for (int i = list.Count - 1; i > 0; i--)
{
int maxIndex = i;
T maxValue = list[i];
for (int j = i - 1; j >= 0; j--)
{
T value = list[j];
if (maxValue.CompareTo(value) < 0)
{
maxValue = value;
maxIndex = j;
}
}
T swap = list[i];
list[i] = list[maxIndex];
list[maxIndex] = swap;
}
}
public static void SelectionSort<T>(IList<T> list, Func<T, T, bool> comp)
{
for (int i = list.Count - 1; i > 0; i--)
{
int maxIndex = i;
T maxValue = list[i];
for (int j = i - 1; j >= 0; j--)
{
T value = list[j];
if (comp(maxValue, value))
{
maxValue = value;
maxIndex = j;
}
}
T swap = list[i];
list[i] = list[maxIndex];
list[maxIndex