递归

任何一个方法既可以调用其他方法又可以调用自己,而当这个方法调用自己时,我们就叫它递归函数或者递归方法!

通常递归有两个特点:

1.递归方法一直会调用自己直到某些条件满足,也就是说一定要有出口;

2.递归方法会有一些参数,而它会把这些新的参数值传递给自己;(自己调自己);

冒泡排序

通过相邻两个值的大小比较(多次),保证数值排序为从小到大的排序方法。

    效果及实现原理:外层的数列个数次的循环,每次循环会将最大的数值“冒泡”到右端,因为是相邻的两两比较。

    具体实现:双重循环,外层数列个数次,保证每一个数值都处于正确位置(因为每循环一次,至少会确定一个数值的正确位置),内层从数列个数次逐渐减少次数,因为每一次外层循环会确定最大值、倒数第二大值……我们在下一次循环就可以忽略掉他们。

插入排序

插入排序(Insert Sort):本质上是待排序列里的元素一个一个的与已排列好的元素进行比较,将其插入到已排列好的序列中,直到没有待排列的元素。类似于打牌的时候摸牌的动作:手上的牌是排列好的,桌子上的牌是待排序的,每从桌子上抓到一只牌,按照一定次序将其插入到手中

int i = 0, j = 0;
int key;
for (j = 1; j < array.Length; j++)
{
  key = array[j];
  i = j - 1;
  while (i >= 0 && array[i] > key)
  {
    array[i + 1] = array[i];
    i -= 1;
  }
  array[i + 1] = key;
  Console.Write("Step {0}:", j);
  DisplayArrayToConsole(array);
}

快速排序

快速排序(Quicksort)是对冒泡排序的一种改进。
(在数据量小于20的时候,插入排序具有最好的性能。当大于20时,快速排序具有最好的性能,归并(merge sort)和堆排序(heap sort)也望尘莫及,尽管复杂度都为nlog2(n)。)
快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
由此思想,我们可以实现快速排序的代码:
注意基准数据永远不变,永远是和基准数据进行比较,无论在什么位置,最后的目的就是把基准数据放在中间,小的放前面大的放后面。

namespace QuickSort
{
class QuickSort
{
private int Func(int[] n, int left, int right)
{
  int baseNum = n[left]; // 基准数据

  int i = left;
  int j = right;
  while (true)
  {
    if (n[i] < baseNum && i < j)
    {
      i++;
    }
    else if (n[i] > baseNum && i < j)
    {
      int number = n[i];
      n[i] = n[j];
      n[j] = number;
      j--;
    }
    else if (n[j] < baseNum && i < j)
    {
      int number = n[i];
      n[i] = n[j];
      n[j] = number;
      i++;
    }
    else if (n[j] > baseNum && i < j)
    {
      j--;
    }
    else if (i == j)
    {
      n[i] = baseNum;
      break;
    }
  }
  return i;
}

public void QuickSortFunc(int[] n, int left, int right)
{
  //左下标一定小于右下标,否则就超越了
  if (left < right)
  {
    //对数组进行分割,取出下次分割的基准标号
    int i = Func(n, left, right);

    //对“基准标号“左侧的一组数值进行递归的切割,以至于将这些数值完整的排序
    QuickSortFunc(n, left, i - 1);

    //对“基准标号“右侧的一组数值进行递归的切割,以至于将这些数值完整的排序
    QuickSortFunc(n, i + 1, right);

  }
}
static void Main(string[] args)
{
  int[] n = { 23, 45, 60, 10, 17, 101,12};
  QuickSort qs = new QuickSort();
  qs.QuickSortFunc(n, 0, n.Length - 1);
  for (int i = 0; i < n.Length; i++)
  {  
    Console.WriteLine(n[i]);
  }

  Console.ReadLine();
}
}
}

归并排序

归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。

而它的时间复杂度就是N*logN,此算法采用的是二分法,所以可以认为对应的对数函数底数为2,也有可能是三分法,底数为3,以此类推。

每次合并操作的平均时间复杂度为O(n),而完全二叉树的深度为|log2n|。总的平均时间复杂度为O(nlogn)。而且,归并排序的最好,最坏,平均时间复杂度均为O(nlogn)。

外排序

Bit-map空间压缩和快速排序去重

1. Bit-map的基本思想
  32位机器上,对于一个整型数,比如int a=1 在内存中占32bit位,这是为了方便计算机的运算。但是对于某些应用场景而言,这属于一种巨大的浪费,因为我们可以用对应的32bit位对应存储十进制的0-31个数,而这就是Bit-map的基本思想。Bit-map算法利用这种思想处理大量数据的排序、查询以及去重。
  Bitmap在用户群做交集和并集运算的时候也有极大的便利。

C#算法的更多相关文章

  1. B树——算法导论(25)

    B树 1. 简介 在之前我们学习了红黑树,今天再学习一种树--B树.它与红黑树有许多类似的地方,比如都是平衡搜索树,但它们在功能和结构上却有较大的差别. 从功能上看,B树是为磁盘或其他存储设备设计的, ...

  2. 分布式系列文章——Paxos算法原理与推导

    Paxos算法在分布式领域具有非常重要的地位.但是Paxos算法有两个比较明显的缺点:1.难以理解 2.工程实现更难. 网上有很多讲解Paxos算法的文章,但是质量参差不齐.看了很多关于Paxos的资 ...

  3. 【Machine Learning】KNN算法虹膜图片识别

    K-近邻算法虹膜图片识别实战 作者:白宁超 2017年1月3日18:26:33 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...

  4. 红黑树——算法导论(15)

    1. 什么是红黑树 (1) 简介     上一篇我们介绍了基本动态集合操作时间复杂度均为O(h)的二叉搜索树.但遗憾的是,只有当二叉搜索树高度较低时,这些集合操作才会较快:即当树的高度较高(甚至一种极 ...

  5. 散列表(hash table)——算法导论(13)

    1. 引言 许多应用都需要动态集合结构,它至少需要支持Insert,search和delete字典操作.散列表(hash table)是实现字典操作的一种有效的数据结构. 2. 直接寻址表 在介绍散列 ...

  6. 虚拟dom与diff算法 分析

    好文集合: 深入浅出React(四):虚拟DOM Diff算法解析 全面理解虚拟DOM,实现虚拟DOM

  7. 简单有效的kmp算法

    以前看过kmp算法,当时接触后总感觉好深奥啊,抱着数据结构的数啃了一中午,最终才大致看懂,后来提起kmp也只剩下“奥,它是做模式匹配的”这点干货.最近有空,翻出来算法导论看看,原来就是这么简单(先不说 ...

  8. 神经网络、logistic回归等分类算法简单实现

    最近在github上看到一个很有趣的项目,通过文本训练可以让计算机写出特定风格的文章,有人就专门写了一个小项目生成汪峰风格的歌词.看完后有一些自己的小想法,也想做一个玩儿一玩儿.用到的原理是深度学习里 ...

  9. 46张PPT讲述JVM体系结构、GC算法和调优

    本PPT从JVM体系结构概述.GC算法.Hotspot内存管理.Hotspot垃圾回收器.调优和监控工具六大方面进行讲述.(内嵌iframe,建议使用电脑浏览) 好东西当然要分享,PPT已上传可供下载 ...

  10. 【C#代码实战】群蚁算法理论与实践全攻略——旅行商等路径优化问题的新方法

    若干年前读研的时候,学院有一个教授,专门做群蚁算法的,很厉害,偶尔了解了一点点.感觉也是生物智能的一个体现,和遗传算法.神经网络有异曲同工之妙.只不过当时没有实际需求学习,所以没去研究.最近有一个这样 ...

随机推荐

  1. java List<Map<String,Object>遍历的方法

    public static void main(String[] args) { List<HashMap<String, Object>> list = new ArrayL ...

  2. RFCN配置参数

    最近一直被人问这个,索性画张图,省得一遍一遍解释.

  3. 一个box四周边框阴影

    实现效果如图: 代码如下: .section { margin: 20upx 30upx; padding: 40upx; border-radius: 6px; border-top: #0670C ...

  4. Taro开发微信小程序之利用腾讯地图sdk标记

    首先要下载腾讯地图提供的sdk,放在项目的对应目录下,引用. import QQMapWX from '../../sdks/qqmap-wx-jssdk' 设置好后,就可以开始使用了. let qq ...

  5. Linux localtime_r调用的一个小问题

    我们一个项目中有如下代码: time_t loc_time; loc_time = time(NULL); localtime_r(&loc_time,&ptr); 这段代码本意是获取 ...

  6. mongo中用嵌套结构优势是什么

    首先需要知道,MongoDB是NoSQL中的一种,是不直接支持Join的,这是NoSQL的一个特点,不需要直接支持Join,可以将横向扩展以及性能做到更好. 但是这不等于说MongoDB不能做Join ...

  7. rancher2.1.7 +jenkins +harbor 自动容器CI系统(通过rancher命令行)

    jenkins脚本执行示例: //环境定义与 cd $WORKSPACEmodule=news-usercd $module/case $deploy in deploy) //发布模块 //编译/o ...

  8. Ubuntu16.04 git上网速度慢的解决方法.

    1.打开网站 IPAddress.com ,输入github.com和github.global.ssl.fastly.net,获取他们的域名对应的ip地址 2.sudo vi /etc/hosts ...

  9. appium 测试过程中遇到的几个问题 ---持续更新!

    一. appium自带的Chromedriver版本和设备Android System Webview版本不一致的问题 报错信息: io.appium.java_client.NoSuchContex ...

  10. Sql 根据当前时间,获取星期一具体日期

    --根据当前时间,计算每周一日期,周日为每周第一天 declare @getDate datetime --set @getDate='2018-12-30' set @getDate='2019-0 ...