C# 常用算法

一、递归算法

  递归:你打开面前这扇门,看到屋里面还有一扇门。你走过去,发现手中的钥匙还可以打开它,你推开门,发现里面还有一扇门,你继续打开它。若干次之后,你打开面前的门后,发现只有一间屋子,没有门了。然后,你开始原路返回,每走回一间屋子,你数一次,走到入口的时候,你可以回答出你到底用这你把钥匙打开了几扇门。

   循环:你打开面前这扇门,看到屋里面还有一扇门。你走过去,发现手中的钥匙还可以打开它,你推开门,发现里面还有一扇门(若前面两扇门都一样,那么这扇门和前两扇门也一样;如果第二扇门比第一扇门小,那么这扇门也比第二扇门小,你继续打开这扇门,一直这样继续下去直到打开所有的门。但是,入口处的人始终等不到你回去告诉他答案。

1、定义:

  在数学与计算机科学中,递归(Recursion)是指在函数的定义中使用函数自身的方法。实际上,递归,顾名思义,其包含了两个意思:递 和 归,这正是递归思想的精华所在。

2、实例(斐波那契数列):1、1、2、3、5、8.......用递归算法求第30位数的值

  static void Main(string[] args)

  {

    int[] sum = new int[30];

    for (int i = 0; i < sum.Length; i++)

    {

      sum[i] = process1(i);

      Console.WriteLine(sum[i]);

    }

  }

  public static int process1(int a)

  {

    if (a == 0 || a == 1) return 1;

    return process1(a - 1) + process1(a - 2);

  }

3、阶乘算法

  public static int process2(int n)

  {

    if (n == 1) return 1;

    return n * process2(n - 1); // 相同重复逻辑,缩小问题的规模

  }

二、冒泡法排序

1、定义:

  就是将一个数组中的元素按照从大到小或者从小到大的排序进行排列。

2、实例:

  int[] nums = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };

  for (int i = 0; i < nums.Length - 1; i++)

  {

    for (int j = 0; j < nums.Length - 1 - i; j++)

    {

      if (nums[j] > nums[j + 1])

      {

        int temp = nums[j];

        nums[j] = nums[j + 1];

        nums[j + 1] = temp;

      }

    }

  }

  // 输出

  foreach (var num in nums)

  {

    Console.WriteLine(num);

  }

3、只能针对数组做一个升序的排序

  int[] nums = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };

  Array.Sort(nums);

4、对数组进行反转

  int[] nums = { 1, 4, 3, 6, 9, 8, 11 };

  Array.Reverse(nums);

三、折半查找、二分算法

1、定义:

  折半搜索,也称二分查找算法、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。

  要计算把目标值插入到该数组中的索引值。最开始的思路:

  ①.先把目标数插入到数组中

  ②.进行排序

  ③.返回索引

2、实例:

  public static int process4(int[] arr, int low, int high, int key)

  {

    int mid = (low + high) / 2;

    if (low > high)

      return -1;

    else

    {

      if (arr[mid] == key)

        return mid;

      else if (arr[mid] > key)

        return process4(arr, low, mid - 1, key);

      else

        return process4(arr, mid + 1, high, key);

    }

  }