数据结构和算法对一个程序来说是至关重要的,现在介绍一下几种算法,在项目中较为常用的算法有:冒泡排序,简单选择排序,直接插入排序,希尔排序,堆排序,归并排序,快速排序等7中算法。

现在介绍选择排序算法,希尔排序算法,快速排序算法。

(1).选择排序算法:通过n-i次关键字间的比较,从n-i+1个记录中选择出关键字最小的记录,并和第i(1大于等于i小于等于n)个记录交换。

(2).希尔排序:先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量  =1( < …<d2<d1),即所有记录放在同一组中进行直接插入排序为止。

(3).快速排序算法:通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。

以上是对算法定义的简单说明,接下来看看算法的具体实现:

1.排序算法类型的接口:

    /// <summary>
/// 排序算法类型的接口
/// </summary>
internal interface ISortAlgorithm
{
/// <summary>
/// 按指定的方向对指定的列表进行排序。
/// </summary>
/// <typeparam name="T">要排序的元素的类型</typeparam>
/// <param name="toSort">要排序的列表</param>
/// <param name="direction">排序方向</param>
/// <param name="startIndex">开始索引</param>
/// <param name="endIndex">结束开始索引</param>
/// <param name="compareFunc">比较功能。</param>
void Sort<T>(IList<T> toSort, SortDirection direction, int startIndex, int endIndex, Comparison<T> compareFunc);
}

2.排序算法工厂类:

    /// <summary>
///排序算法工厂类
/// </summary>
internal static class SortAlgorithmFactory
{
/// <summary>
/// 创建排序算法实现。
/// </summary>
/// <param name="algorithm">算法</param>
/// <returns></returns>
internal static ISortAlgorithm CreateSortAlgorithmImplementation(SortAlgorithm algorithm)
{
ISortAlgorithm toReturn = null; switch (algorithm)
{
case SortAlgorithm.SelectionSort:
toReturn = new SelectionSorter();
break;
case SortAlgorithm.ShellSort:
toReturn = new ShellSorter();
break;
case SortAlgorithm.QuickSort:
toReturn = new QuickSorter();
break;
} return toReturn;
}
}

3.快速排序算法 :

    /// <summary>
/// 快速排序算法
/// </summary>
internal class QuickSorter : ISortAlgorithm
{
/// <summary>
/// 按指定的方向对指定的列表进行排序。
/// </summary>
/// <typeparam name="T">要排序的元素的类型</typeparam>
/// <param name="toSort">要排序的列表。</param>
/// <param name="direction">在侵权行为中排序元素的方向。</param>
/// <param name="startIndex">开始索引。</param>
/// <param name="endIndex">结束索引。</param>
/// <param name="compareFunc">比较功能。</param>
void ISortAlgorithm.Sort<T>(IList<T> toSort, SortDirection direction, int startIndex, int endIndex, Comparison<T> compareFunc)
{
Func<T, T, bool> valueComparerTest;
switch (direction)
{
case SortDirection.Ascending:
valueComparerTest = (a, b) => (compareFunc(a, b) < );
break;
case SortDirection.Descending:
valueComparerTest = (a, b) => (compareFunc(a, b) > );
break;
default:
throw new ArgumentOutOfRangeException("direction", "Invalid direction specified, can't craete value comparer func");
} PerformSort(toSort, startIndex, endIndex, valueComparerTest);
} /// <summary>
/// 在列表中执行分区的排序,这个例程被递归调用。
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="toSort">排序。</param>
/// <param name="left">左索引。</param>
/// <param name="right">正确的索引。</param>
/// <param name="valueComparerTest">值比较器测试。</param>
private static void PerformSort<T>(IList<T> toSort, int left, int right, Func<T, T, bool> valueComparerTest)
{
while (true)
{
if (right <= left)
{
return;
}
var pivotIndex = Partition(toSort, left, right, left, valueComparerTest);
PerformSort(toSort, left, pivotIndex - , valueComparerTest);
left = pivotIndex + ;
}
} /// <summary>
///分区指定的列表
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="toSort">排序。</param>
/// <param name="left">左边。</param>
/// <param name="right">右边</param>
/// <param name="pivotIndex">枢轴索引。</param>
/// <param name="valueComparerTest">值比较器测试。</param>
/// <returns>新枢纽点的索引</returns>
private static int Partition<T>(IList<T> toSort, int left, int right, int pivotIndex, Func<T, T, bool> valueComparerTest)
{
var pivotValue = toSort[pivotIndex];
toSort.SwapValues(pivotIndex, right);
var storeIndex = left;
for (var i = left; i < right; i++)
{
if (!valueComparerTest(toSort[i], pivotValue))
{
continue;
}
toSort.SwapValues(i, storeIndex);
storeIndex++;
}
toSort.SwapValues(storeIndex, right);
return storeIndex;
}
}

4.希尔排序算法:

    /// <summary>
///希尔排序算法
/// </summary>
internal class ShellSorter : ISortAlgorithm
{
/// <summary>
/// 按指定的方向对指定的列表进行排序。
/// </summary>
/// <typeparam name="T">要排序的元素的类型</typeparam>
/// <param name="toSort">要排序的列表</param>
/// <param name="direction">排序方向</param>
/// <param name="startIndex">开始索引</param>
/// <param name="endIndex">结束开始索引</param>
/// <param name="compareFunc">比较功能。</param>
void ISortAlgorithm.Sort<T>(IList<T> toSort, SortDirection direction, int startIndex, int endIndex, Comparison<T> compareFunc)
{
Func<T, T, bool> valueComparerTest;
switch (direction)
{
case SortDirection.Ascending:
valueComparerTest = (a, b) => (compareFunc(a, b) > );
break;
case SortDirection.Descending:
valueComparerTest = (a, b) => (compareFunc(a, b) < );
break;
default:
throw new ArgumentOutOfRangeException("direction", "Invalid direction specified, can't craete value comparer func");
} int[] increments = { , , , , , , , , , , , , , , , };
for (var incrementIndex = ; incrementIndex < increments.Length; incrementIndex++)
{
for (int intervalIndex = increments[incrementIndex], i = startIndex + intervalIndex; i <= endIndex; i++)
{
var currentValue = toSort[i];
var j = i;
while ((j >= intervalIndex) && valueComparerTest(toSort[j - intervalIndex], currentValue))
{
toSort[j] = toSort[j - intervalIndex];
j -= intervalIndex;
}
toSort[j] = currentValue;
}
}
}
}

5.选择排序算法:

    /// <summary>
/// 选择排序算法
/// </summary>
internal class SelectionSorter : ISortAlgorithm
{
/// <summary>
/// 按指定的方向对指定的列表进行排序。
/// </summary>
/// <typeparam name="T">要排序的元素的类型</typeparam>
/// <param name="toSort">要排序的列表。</param>
/// <param name="direction">在侵权行为中排序元素的方向。</param>
/// <param name="startIndex">开始索引。</param>
/// <param name="endIndex">结束索引。</param>
/// <param name="compareFunc">比较功能。</param>
void ISortAlgorithm.Sort<T>(IList<T> toSort, SortDirection direction, int startIndex, int endIndex, Comparison<T> compareFunc)
{
Func<T, T, bool> valueComparerTest;
switch (direction)
{
case SortDirection.Ascending:
valueComparerTest = (a, b) => (compareFunc(a, b) > );
break;
case SortDirection.Descending:
valueComparerTest = (a, b) => (compareFunc(a, b) < );
break;
default:
throw new ArgumentOutOfRangeException("direction", "指定的方向无效,无法创建值比较器函数");
} for (var i = startIndex; i < endIndex; i++)
{
var indexValueToSwap = i;
for (var j = i + ; j <= endIndex; j++)
{
if (valueComparerTest(toSort[indexValueToSwap], toSort[j]))
{
indexValueToSwap = j;
}
}
toSort.SwapValues(i, indexValueToSwap);
}
}
}

以上的算法实现中,采用了简单工厂模式,实现算法的松耦合。

简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。简单工厂模式包含必要的判断逻辑,能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。

简单工厂的UML图如下:

如果需要增加新的算法,在添加完新的算法实现类后,可直接在工厂方法中添加case分支,无需在客户端更改类,只需要在子类中选择实现类即可。

最新文章

  1. 关于Android中的三级缓存
  2. 「理解HTTP」之常见的状态码segmentfault
  3. 虚拟机linux上网问题
  4. php文件上传参考配置与大文件上传
  5. python 代码片段19
  6. 解决中64位Win7系统上PLSQL无法连接ORACLE的方法(PLSQL无法识别ORACLE_HOME的配置)
  7. Linux 查看CPU,内存,硬盘 !转
  8. com学习(四)2——用 ATL 写第一个组件(vs2003)
  9. Eclipse提示Tomcat miss丢失bug:The Tomcat server configuration at \Servers\Tomcat v5.5 Server at localhost-config is missing.
  10. Hadoop on Mac with IntelliJ IDEA - 9 解决Type mismatch in value from map问题
  11. scanf从文件中读入,printf写入到文件
  12. sharepreference实现记住password功能
  13. iOS swift lazy loading
  14. Android入门之login设计
  15. 刚装的系统C盘占空间特别大怎么办?关闭win7的系统还原和调整虚拟内存
  16. BZOJ 1502: [NOI2005]月下柠檬树 [辛普森积分 解析几何 圆]
  17. my live thinkcenter / ThinkCentre M920x Tiny / Thinkpad yoga 12 vPro
  18. 安装 R 包报错 clang: error: unsupported option &#39;-fopenmp&#39; 的解决方法
  19. 20164310Exp6 信息搜索和漏洞扫描
  20. pushf和popf

热门文章

  1. android 之HttpURLConnection的post,get方式请求数据
  2. 有Maple T.A.自有试题图so easy
  3. 启动App的Intent
  4. SQLSERVER中的ALL、PERCENT、CUBE关键字、ROLLUP关键字和GROUPING函数
  5. [译]MVC网站教程(一):多语言网站框架
  6. .NET垃圾回收 – 原理浅析
  7. ASP.NET MVC学前篇之扩展方法、链式编程
  8. ASP.NET MVC 路由(五)
  9. Opengl中矩阵和perspective/ortho的相互转换
  10. Tomcat 让百度的域名显示自己的页面内容(玩耍篇)