# 一个开源且全面的C#算法实战教程

## 主要算法包括

• 排序算法：冒泡排序、插入排序、计数排序、快速排序等
• 搜索算法：线性搜索、二分搜索等
• 数值计算：最大公约数、二项式系数、牛顿的平方根计算、欧拉方法等
• 字符串算法：Rabin-Karp 算法、KMP 算法、Manacher 算法等
• 数据结构：链表 (Linked List)、栈 (Stack)、队列 (Queue)、二叉树 (Binary Tree)等
• 图算法：深度优先搜索 (Depth-First Search)、广度优先搜索 (Breadth-First Search)、Dijkstra 最短路径等
• 等等......

## 插入排序

/// <summary>
///     Class that implements insertion sort algorithm.
/// </summary>
/// <typeparam name="T">Type of array element.</typeparam>
public class InsertionSorter<T> : IComparisonSorter<T>
{
/// <summary>
///     Sorts array using specified comparer,
///     internal, in-place, stable,
///     time complexity: O(n^2),
///     space complexity: O(1),
///     where n - array length.
/// </summary>
/// <param name="array">Array to sort.</param>
/// <param name="comparer">Compares elements.</param>
public void Sort(T[] array, IComparer<T> comparer)
{
for (var i = 1; i < array.Length; i++)
{
for (var j = i; j > 0 && comparer.Compare(array[j], array[j - 1]) < 0; j--)
{
var temp = array[j - 1];
array[j - 1] = array[j];
array[j] = temp;
}
}
}
}

## 快速排序

/// <summary>
///     Sorts arrays using quicksort.
/// </summary>
/// <typeparam name="T">Type of array element.</typeparam>
public abstract class QuickSorter<T> : IComparisonSorter<T>
{
/// <summary>
///     Sorts array using Hoare partition scheme,
///     internal, in-place,
///     time complexity average: O(n log(n)),
///     time complexity worst: O(n^2),
///     space complexity: O(log(n)),
///     where n - array length.
/// </summary>
/// <param name="array">Array to sort.</param>
/// <param name="comparer">Compares elements.</param>
public void Sort(T[] array, IComparer<T> comparer) => Sort(array, comparer, 0, array.Length - 1);
protected abstract T SelectPivot(T[] array, IComparer<T> comparer, int left, int right);
private void Sort(T[] array, IComparer<T> comparer, int left, int right)
{
if (left >= right)
{
return;
}
var p = Partition(array, comparer, left, right);
Sort(array, comparer, left, p);
Sort(array, comparer, p + 1, right);
}
private int Partition(T[] array, IComparer<T> comparer, int left, int right)
{
var pivot = SelectPivot(array, comparer, left, right);
var nleft = left;
var nright = right;
while (true)
{
while (comparer.Compare(array[nleft], pivot) < 0)
{
nleft++;
}
while (comparer.Compare(array[nright], pivot) > 0)
{
nright--;
}
if (nleft >= nright)
{
return nright;
}
var t = array[nleft];
array[nleft] = array[nright];
array[nright] = t;
nleft++;
nright--;
}
}
}

## 线性搜索

/// <summary>
///     Class that implements linear search algorithm.
/// </summary>
/// <typeparam name="T">Type of array element.</typeparam>
public class LinearSearcher<T>
{
/// <summary>
///     Finds first item in array that satisfies specified term
///     Time complexity: O(n)
///     Space complexity: O(1).
/// </summary>
/// <param name="data">Array to search in.</param>
/// <param name="term">Term to check against.</param>
/// <returns>First item that satisfies term.</returns>
public T Find(T[] data, Func<T, bool> term)
{
for (var i = 0; i < data.Length; i++)
{
if (term(data[i]))
{
return data[i];
}
}
throw new ItemNotFoundException();
}
/// <summary>
///     Finds index of first item in array that satisfies specified term
///     Time complexity: O(n)
///     Space complexity: O(1).
/// </summary>
/// <param name="data">Array to search in.</param>
/// <param name="term">Term to check against.</param>
/// <returns>Index of first item that satisfies term or -1 if none found.</returns>
public int FindIndex(T[] data, Func<T, bool> term)
{
for (var i = 0; i < data.Length; i++)
{
if (term(data[i]))
{
return i;
}
}
return -1;
}
}

## 项目源码地址

GitHub开源地址：https://github.com/TheAlgorithms/C-Sharp

## 优秀项目和框架精选

https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.md

|
26天前
|

C#实战 ｜ 求解《九章算术》盈不足之共买物
【7月更文挑战第8天】中国古代数学成就显著，《九章算术》展示了先进的算法，如分数运算和方程解法，领先世界数百年。项目示例通过控制台应用，运用for循环和if条件语句，模拟解决书中盈不足问题，展示了解决数学问题的编程方法。
28 6
|
25天前
|

C#实战 ｜ 求解《丘建算经》百鸡问题
【7月更文挑战第9天】《丘建算经》的百鸡问题是一个经典的不定方程问题，用C#解决时，通过三重嵌套循环穷举公鸡、母鸡和小鸡的组合。代码示例中，外层循环分别对应公鸡和母鸡，而小鸡数量由总钱数和已知鸡种计算得出，避免了额外的内层循环。使用if判断确保总数量正确。注意，除法运算可能导致整数截断错误，需使用3.0保证浮点数除法的准确性。这种方法虽然效率较低，但能确保找到所有可行解。
22 1
|
19天前
|

【7月更文挑战第23天】在Python编程中，掌握算法复杂度—时间与空间消耗，是提升程序效能的关键。算法如冒泡排序（$O(n^2)$时间/$O(1)$空间），或使用Python内置函数找最大值（$O(n)$时间），需精确诊断与优化。数据结构如哈希表可将查找从$O(n)$降至$O(1)$。运用timeit模块评估性能，深入理解数据结构和算法，使Python代码更高效。持续实践与学习，精通复杂度管理。
35 9
|
20天前
|

52 5
|
20天前
|

【7月更文挑战第22天】在大数据领域，Python算法效率至关重要。本文深入解析时间与空间复杂度，用大O表示法衡量执行时间和存储需求。通过冒泡排序(O(n^2)时间，O(1)空间)与快速排序(平均O(n log n)时间，O(log n)空间)实例，展示Python代码实现与复杂度分析。策略包括算法适配、分治法应用及空间换取时间优化。掌握这些，可提升大数据处理能力，持续学习实践是关键。
30 1
|
25天前
|

53 5
|
27天前
|

31 8
|
27天前
|

37 8
|
27天前
|

35 7
|
23天前
|

【7月更文挑战第19天】Trie树，又称前缀树，是优化字符串搜索的高效数据结构。通过利用公共前缀，Trie树能快速插入、删除和查找字符串。
40 2