文档章节

DotNet常用排序算法总结

彭泽0902
 彭泽0902
发布于 2016/11/24 18:47
字数 1543
阅读 0
收藏 0

码上生花,ECharts 作品展示赛正式启动!>>>

   数据结构和算法对一个程序来说是至关重要的,现在介绍一下几种算法,在项目中较为常用的算法有:冒泡排序,简单选择排序,直接插入排序,希尔排序,堆排序,归并排序,快速排序等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) < 0);
                    break;
                case SortDirection.Descending:
                    valueComparerTest = (a, b) => (compareFunc(a, b) > 0);
                    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 - 1, valueComparerTest);
                left = pivotIndex + 1;
            }
        }


        /// <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) > 0);
                    break;
                case SortDirection.Descending:
                    valueComparerTest = (a, b) => (compareFunc(a, b) < 0);
                    break;
                default:
                    throw new ArgumentOutOfRangeException("direction", "Invalid direction specified, can't craete value comparer func");
            }

            int[] increments = { 1391376, 463792, 198768, 86961, 33936, 13776, 4592, 1968, 861, 336, 112, 48, 21, 7, 3, 1 };
            for (var incrementIndex = 0; 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) > 0);
                    break;
                case SortDirection.Descending:
                    valueComparerTest = (a, b) => (compareFunc(a, b) < 0);
                    break;
                default:
                    throw new ArgumentOutOfRangeException("direction", "指定的方向无效,无法创建值比较器函数");
            }

            for (var i = startIndex; i < endIndex; i++)
            {
                var indexValueToSwap = i;
                for (var j = i + 1; j <= endIndex; j++)
                {
                    if (valueComparerTest(toSort[indexValueToSwap], toSort[j]))
                    {
                        indexValueToSwap = j;
                    }
                }
                toSort.SwapValues(i, indexValueToSwap);
            }
        }
    }

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

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

     简单工厂的UML图如下:

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

© 著作权归作者所有

彭泽0902
粉丝 0
博文 44
码字总数 57771
作品 0
武汉
高级程序员
私信 提问
加载中
请先登录后再评论。
轻松掌握VS Code开发.Net Core及创建Xunit单元测试

##前言 本篇文章主要还是介绍使用 VS Code 进行.Net Core开发和常用 CLI命令的使用,至于为啥要用VS Code ,因为它是真的是好看又好用 :) ,哈哈,主要还是为了跨平台开发做准备。 ##开发环...

osc_2qxlyxer
2018/03/03
2
0
vs code开发.net core项目入门

今天用vs code来开发net core项目,写一下简要的开发流程,主要步骤如下,看完后你会发现特别简单 1、命令如下: (cmd中运行以下命令,下面命令都基于选择好自己的项目路径) 1、新建文件夹...

osc_c4xow9p9
2018/06/13
4
0
.net core运行环境搭建 linux + windows

---------------------------------------linux------------------------------------------------- 一.添加dotnet产品Feed 在安装.NET Core之前,您需要注册Microsoft产品Feed。 这只需要做......

osc_5512k200
2018/11/19
4
0
四、附加到进程调试(.NET Core)

1、安装.net core windows server托管工具包: 1、下载https://dotnet.microsoft.com/download/thank-you/dotnet-runtime-2.2.6-windows-hosting-bundle-installer 2、:指定目录发现访问404......

osc_kel5e0sw
2019/07/26
1
0
DotNET企业架构应用实践-系列目录

系列介绍 我一直在写关于AgileEAS.NET平台的一系列文章,也一直在推广AgileEAS.NET平台,本来也无意于独立的写这么一个系列,最早我是混杂在AgileEAS.NET平台中进行介绍的,即介绍平台的同时...

魏琼东
2010/10/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

springboot单元测试配置

##SpringBoot进行单元测试 ####需要的依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><excl......

RandomObject
30分钟前
17
0
看了同事的代码,我忍不住写了这份代码指南

❝ 作者:xybaby 链接:https://www.cnblogs.com/xybaby/p/11335829.html ❞ 前言 写出整洁的代码,是每个程序员的追求。《clean code》指出,要想写出好的代码,首先得知道什么是肮脏代码、...

osc_fvp5wdwk
38分钟前
24
0
Flutter基础篇(2)-- 老司机用一篇博客带你快速熟悉Dart语法

版权声明:本文为博主原创文章,未经博主允许不得转载。https://www.jianshu.com/p/3d927a7bf020 转载请标明出处: https://www.jianshu.com/p/3d927a7bf020 本文出自 AWeiLoveAndroid的博客...

osc_dg21zk4i
39分钟前
18
0
如何在小程序制作表单活动?

比起纸质的表单,电子版表单更加受市场的青睐,尤其是随着越来越多的东西都被赋予了营销属性,不只是只有广告才能够做宣传,比如说表单也不仅仅只是一个收集信息的工具,我们对表单加以包装,...

osc_9bje7o1h
40分钟前
10
0
Intel x710万兆 SR-IOV 网卡驱动升级

目录 文章目录 目录 环境 获取最新驱动 安装 环境 CentOS7 Intel x710 获取最新驱动 官方地址:https://downloadcenter.intel.com/zh-cn/product/83967/Intel-Ethernet-Converged-Network-A...

osc_b9r67jnt
41分钟前
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部