排序可以说是笔试题经常出现的一道简单算法题了,主要考察程序员的基本功和是否科班出身。这里用c# 简单实现了三种排序算法。
一、插入排序
插入排序的基本思想是:每步将一个待排序的记录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。
调用方式
List<int> y = InsertionSort<int>(i, (a, b) => { return a < b; });
int[] z = InsertionSort<int>(m, (a, b) => { return a < b; });
#region 插入排序
public List<T> InsertionSort<T>(List<T> list, Func<T, T, bool> comparer)
{
for (int i = 1, j = list.Count; i < j; i++)
{
int m = i-1;
T temp = list[i];//保存当前的元素
while (m >= 0 && comparer(list[m], temp))
{
list[m + 1] = list[m];
m--;
}
list[m+1] = temp;
}
return list;
}
public T[] InsertionSort<T>(T[] list, Func<T, T, bool> comparer)
{
for (int i = 1, j = list.Length; i < j; i++)
{
int m = i - 1;
T temp = list[i];//保存当前的元素
while (m >= 0 && comparer(list[m], temp))
{
list[m + 1] = list[m];
m--;
}
list[m + 1] = temp;
}
return list;
}
#endregion
二、选择排序
工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。
//选择排序
List<int> k = SelectionSort<int>(i, (a, b) => { return a < b; });
int[] x = SelectionSort<int>(m, (a, b) => { return a < b; });
#region 选择排序
public List<T> SelectionSort<T>(List<T> list, Func<T, T, bool> comparer)
{
if (list == null || list.Count <= 0) return list;
for (int i = 0, j = list.Count - 1; i < j; i++)
{
int k = i;
for (int m = i + 1, n = j + 1; m < n; m++)
{
if (comparer(list[k], list[m]))
{
k = m;
}
}
T temp = list[i];
list[i] = list[k];
list[k] = temp;
}
return list;
}
public T[] SelectionSort<T>(T[] list, Func<T, T, bool> comparer)
{
if (list == null || list.Length <= 0) return list;
for (int i = 0, j = list.Length - 1; i < j; i++)
{
int k = i;
for (int m = i + 1, n = j + 1; m < n; m++)
{
if (comparer(list[k], list[m]))
{
k = m;
}
}
T temp = list[i];
list[i] = list[k];
list[k] = temp;
}
return list;
}
#endregion
三、冒泡排序
冒泡排序算法的原理如下:
-
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
-
对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
-
针对所有的元素重复以上的步骤,除了最后一个。
-
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
List<int> j = BubbleSort<int>(i, (a, b) => { return a < b; });
int[] n = BubbleSort<int>(m, (a, b) => { return a < b; });
public List<T> BubbleSort<T>(List<T> list, Func<T, T, bool> comparer)
{
if (list == null || list.Count <= 0) return list;
for (int i = 0, j = list.Count - 1; i < j; i++)
{
for (int m = i + 1, n = j + 1; m < n; m++)
{
if (comparer(list[i], list[m]))
{
T temp1 = list[i];
list[i] = list[m];
list[m] = temp1;
}
}
}
return list;
}
/// <summary>
/// 数组冒泡排序
/// </summary>
/// <typeparam name="T">类型</typeparam>
/// <param name="list">数组</param>
/// <param name="comparer">用于比较的委托</param>
/// <returns></returns>
public T[] BubbleSort<T>(T[] list, Func<T, T, bool> comparer)
{
if (list == null || list.Length <= 0) return list;
for (int i = 0, j = list.Length - 1; i < j; i++)
{
for (int m = i + 1, n = j + 1; m < n; m++)
{
if (comparer(list[i], list[m]))
{
T temp1 = list[i];
list[i] = list[m];
list[m] = temp1;
}
}
}
return list;
}