目录

前言

一、底层库介绍

二、底层库源码

三、调用方法

四、项目案例

五、系列文章


前言

本专栏为【底层库】,主要介绍编程过程中 通用函数。我们将这些通用固化的源码,进行重写、封装、拓展,再进行单元测试、集成测试、beta测试,最终形成通用化模板,这里我们称为“底层库”。

作为研发人员的你,并不需要花大量时间,研究“底层库”的含义,及“底层库”的实现方法。你只需要几行调用代码,就可以解决项目上碰到的难题。而底层库使用方法,本专栏均有详细介绍,也有项目应用场景。

底层库已实现功能:MySQL脚本构建器、MySQL数据库访问操作、参数配置文件读写、加解密算法、日志记录、HTTP通信、Socket通信、API前后端交互、邮件发送、文件操作、配置参数存储、Excel导入导出、CSV和DataTable转换、压缩解压、自动编号、Session操作等。

本专栏会持续更新,不断优化【底层库】,大家有任何问题,可以私信我。本专栏之间关联性较强(我会使用到某些底层库,某些文章可能忽略介绍),如果您对本专栏感兴趣,欢迎关注,我将带你用最简洁的代码,实现最复杂的功能。

一、底层库介绍

8大排序算法:

交换排序(冒泡排序、快速排序)

插入排序(直接插入、shell排序)

选择排序(直接选择、堆排序)

归并排序

基数排序

* 术语解释:
  1、稳定排序:如果 a 原本在 b 的前面,且 a == b,排序之后 a 仍然在 b 的前面,则为稳定排序。
  2、非稳定排序:如果 a 原本在 b 的前面,且 a == b,排序之后 a 可能不在 b 的前面,则为非稳定排序。
  3、原地排序:原地排序就是指在排序过程中不申请多余的存储空间,只利用原来存储待排数据的存储空间进行比较和交换的数据排序。
  4、非原地排序:需要利用额外的数组来辅助排序。
  5、时间复杂度:一个算法执行所消耗的时间。
  6、空间复杂度:一个算法运行所需的内存大小。

二、底层库源码

创建类文件SortHelper.cs,代码如下:

 public class SortHelper
    {
        /// <summary>
        /// 交换排序 - 冒泡排序
        /// 描述:首先从数组的第一个元素开始到数组最后一个元素为止,对数组中相邻的两个元素进行比较,如果位于数组左端的元素大于数组右端的元素,
        /// 则交换这两个元素在数组中的位置。这样操作后数组最右端的元素即为该数组中所有元素的最大值,接着对该数组除最右端的n-1个元素进行同样的
        /// 操作,再接着对剩下的n-2ge元素做同样的操作,直到整个数组有序排列。
        /// 
        /// 算法:
        /// 时间复杂度为 O(n^2)
        /// 空间复杂度为 O(1)
        /// </summary>
        public void bubbleSort(int[] arr)
        {
            //控制共比较多少轮
            for (int i = 0; i < arr.Length; i++)
            {
                //控制比较的次数
                for (int j = 0; j < arr.Length - 1 - i; j++)
                {
                    if (arr[j] > arr[j + 1])
                    {
                        int temp = arr[j];
                        arr[j] = arr[j + 1];
                        arr[j + 1] = temp;
                    }
                }
            }
        }

        /// <summary>
        /// 交换排序 - 快速排序
        /// 描述:左右两端选择一个数作为游标,在挑选第一个数字为基准数,比较两端的值是否比基准数大,大的放右边,小的放左边。然后两端的游标往中间靠拢,
        /// 直到游标的值重合,停止。然后再次选择第二个数字为基准数,反复刚才的操作。
        /// 
        /// 算法:
        /// 时间复杂度为 O(nlog2n)
        /// 空间复杂度为 O(1)
        /// </summary>
        /// <param name="arr"></param>

        public void quickSort(int[] arr, int start, int end)
        {
            if (start < end)//结束标记,中间要有 元素
            {
                //把数组中的第0个数字作为标准数
                int stard = arr[start];
                //记录需要排序的游标
                int low = start;
                int high = end;
                //循环找比标准数大的数和比标准数小的数
                while (low < high)
                {
                    //右边的数字比标准数大
                    while (low < high && stard <= arr[high])
                    {
                        high--;
                    }
                    //使用右边的数字替换左边的数
                    arr[low] = arr[high];
                    //如果左边的数字比标准数小
                    while (low < high && arr[low] <= stard)
                    {
                        low++;
                    }
                    arr[high] = arr[low];
                }
                //把标准数赋给低所在的位置的元素
                arr[low] = stard;
                //处理所有的小的数字
                quickSort(arr, start, low);
                //处理所有的大的数字
                quickSort(arr, low + 1, end);
            }
        }


        /// <summary>
        /// 插入排序--直接插入排序
        /// 描述;从第二个数开始,依次比较前面的数是否比自己大,大的插入到前面,再依次比较,直到不比自己大。
        /// 处理过程,比自己大的数字依次后移,然后拿临时变量中的值,替换最初移动的那个
        /// 
        /// 算法:
        /// 时间复杂度为 O(n^2)
        /// 空间复杂度为 O(1)
        /// </summary>
        /// <param name="arr"></param>
        public void insertSort(int[] arr)
        {
            //遍历所有的数字
            for (int i = 1; i < arr.Length; i++)
            {
                //如果当前数字比前一个数字小
                if (arr[i] < arr[i - 1])
                {
                    //把当前遍历数字存起来
                    int temp = arr[i];
                    int j;
                    //遍历当前数字前面所有的数字
                    for (j = i - 1; j >= 0 && temp < arr[j]; j--)
                    {
                        //把前一个数字赋给后一个数
                        arr[j + 1] = arr[j];
                    }
                    //把临时变量(外层for循环的当前元素)赋给不满足条件的后一个元素。
                    arr[j + 1] = temp;
                }

            }
        }

        /// <summary>
        /// 插入排序--希尔排序
        /// 描述:解决直接插入排序较慢的问题,假设有一组顺序的数,突然来了一个元素比较小,依旧需要挨个比较前面的值,插入最前面,效率不高。
        /// 希尔排序引入步长概念,按步长划分组,组内进行排序
        /// 
        /// 算法:
        /// 时间复杂度为 O(n^2)
        /// 空间复杂度为 O(1)
        /// </summary>
        /// <param name="arr"></param>
        public void shellSort(int[] arr)
        {
            //遍历所有的步长
            for (int d = arr.Length / 2; d > 0; d /= 2)
            {
                //遍历所有元素
                for (int i = d; i < arr.Length; i++)
                {
                    //遍历本组中所有的元素
                    for (int j = i - d; j >= 0; j -= d)
                    {
                        //如果当前元素大于加上步长后的那个元素
                        if (arr[j] > arr[j + d])
                        {
                            int temp = arr[j];
                            arr[j] = arr[j + d];
                            arr[j + d] = temp;
                        }
                    }
                }
            }
        }

        /// <summary>
        /// 选择排序--简单选择排序
        /// 说明:找一个最小的数,移动到第一个位置,然后依次找其后第二小的数字移动到前面。
        /// 
        /// 算法:
        /// 时间复杂度为 O(n^2)
        /// 空间复杂度为 O(1)
        /// </summary>
        /// <param name="arr"></param>
        public void choiseSort(int[] arr)
        {
            //遍历所有的数
            for (int i = 0; i < arr.Length; i++)
            {
                int minIndex = i;
                //把当前遍历的数和后面所有的数依次进行比较,并记录下最小的数的下标
                for (int j = i + 1; j < arr.Length; j++)
                {
                    //如果后面比较的数比记录的最小的数小
                    if (arr[minIndex] > arr[j])
                    {
                        //记录下最小的那个数的下标
                        minIndex = j;
                    }
                }
                //如果最小的数和当前遍历数的下标不一致,说明下标为minindex的数比当前遍历的数更小。
                if (i != minIndex)
                {
                    int temp = arr[i];
                    arr[i] = arr[minIndex];
                    arr[minIndex] = temp;
                }
            }
        }

        //选择排序--堆排序


    }

三、调用方法

本帮助类已封装进 通用库中Geyc.Utils.dll,引入命名空间可以直接使用。如有错误请联系作者修改,为底层建设类库贡献力量,让编程变成一种享受。

        static void Main(string[] args)
        {
            int[] arr = {5,7,2,9,4,1,0,5,7 };
            Console.WriteLine("排序前:");
            Console.WriteLine(string.Join(",", arr));
            SortHelper sortHelper = new SortHelper();
            //sortHelper.BubbleSort(arr);
            //sortHelper.quickSort(arr,0,arr.Length-1);
            //sortHelper.insertSort(arr);
            //sortHelper.shellSort(arr);
            sortHelper.choiseSort(arr);

            //输出结果
            Console.WriteLine("排序后:");
            Console.WriteLine(string.Join(",", arr));
            Console.ReadLine();
        }

四、项目案例

后期补充

五、系列文章

C#底层库--记录日志帮助类
本文链接:C#底层库--日志记录帮助类_c# 日志类_花北城的博客-CSDN博客

C#底层库--数据库访问帮助类(MySQL版)
本文链接:C#底层库--MySQL数据库访问操作辅助类(推荐阅读)_mysql安装教程_花北城的博客-CSDN博客

C#底层库--获取文件版本和MD5值
本文链接:https://blog.csdn.net/youcheng_ge/article/details/112513871

C#底层库--操作文件帮助类FileHelper(获取目录的所有文件)
本文链接:C#底层库--FilesHelper文件辅助类(删除目录文件、复制文件到指定目录)_c# filehelper_花北城的博客-CSDN博客

C#底层库--操作Excel帮助类(读取、导出表格)
本文链接:C#底层库--操作Excel帮助类(读取、导出表格)_c# excel库_花北城的博客-CSDN博客

C#底层库--软件版本管理XML
本文链接:C#项目--软件版本和文件MD5记录(XML操作)_花北城的博客-CSDN博客

C#底层库--随机数生成类
本文链接:C#底层库--随机数生成类_花北城的博客-CSDN博客

C#底层库--正则表达式帮助类
本文链接:C#底层库--RegexHelper正则表达式辅助类_c# 正则表达式辅助类_花北城的博客-CSDN博客

C#底层库--CSV和DataTable相互转换
本文链接:C#底层库--CSV和DataTable相互转换_c# csv datatable_花北城的博客-CSDN博客

C#底层库--Image图片操作类
本文链接:C#底层库--Image图片操作类_c# 图片处理类库_花北城的博客-CSDN博客

C#底层库--JSON帮助类_详细(序列化、反序列化、list、datatable)
本文链接:C#底层库--JSON帮助类_详细(序列化、反序列化、list、datatable)_c# json库_花北城的博客-CSDN博客

C#底层库--cookie操作辅助类
本文链接:C#底层库--cookie操作辅助类_花北城的博客-CSDN博客

C#底层库--Session操作辅助类
本文链接:C#底层库--Session操作辅助类_sessionhelper文件_花北城的博客-CSDN博客

C#底层库--数据实体类
本文链接:C#底层库--数据实体类_c#数据库实体模型_花北城的博客-CSDN博客

C#底层库--Image图片操作类
本文链接:C#底层库--Image图片操作类_c# 图片处理类库_花北城的博客-CSDN博客

C#底层库--数据库类型与程序类型转换类
本文链接:C#底层库--数据库类型与程序类型转换类_花北城的博客-CSDN博客

C#底层库--日期扩展类(上周、本周、明年、前年等)
本文链接:【C#】日期范围生成(构建本周开始、结束日期)_c# 本周_花北城的博客-CSDN博客

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐