分享C++程序员常用的算法(适合面试)

以下是 C++ 中一些常用的算法:

一、排序算法

  1. 冒泡排序(Bubble Sort)

    • 原理:

      • 比较相邻的元素,如果前一个比后一个大,则交换它们的位置。
      • 对每一对相邻元素重复以上操作,从开始第一对到结尾的最后一对。这样在一轮比较之后,最大的元素就会 “浮” 到数组的末尾。
      • 重复以上步骤,除了已经排序好的最后一个元素,直到整个数组有序。
    • 示例代码:

      void bubbleSort(int arr[], int n) {
          for (int i = 0; i < n - 1; i++) {
              for (int j = 0; j < n - i - 1; j++) {
                  if (arr[j]>arr[j + 1]) {
                      int temp = arr[j];
                      arr[j]=arr[j + 1];
                      arr[j + 1]=temp;
                  }
              }
          }
      }

    • 插入排序(Insertion Sort)

      • 原理:

        • 从第二个元素开始(索引为 1),将当前元素与前面已排序的元素进行比较。
        • 如果当前元素小于前面的元素,则将前面的元素向后移动一位,直到找到合适的位置插入当前元素。
        • 重复这个过程,直到整个数组有序。
      • 示例代码:

        void insertionSort(int arr[], int n) {
            for (int i = 1; i < n; i++) {
                int key = arr[i];
                int j = i - 1;
                while (j >= 0 && arr[j]>key) {
                    arr[j + 1]=arr[j];
                    j--;
                }
                arr[j + 1]=key;
            }
        }

      • 快速排序(Quick Sort)

        • 原理:

          • 选择一个基准元素(通常是数组的第一个元素)。
          • 将数组分为两部分,左边部分的元素都小于等于基准元素,右边部分的元素都大于基准元素。
          • 递归地对左右两部分进行快速排序,直到整个数组有序。
        • 示例代码:

          int partition(int arr[], int low, int high) {
              int pivot = arr[low];
              int i = low + 1;
              int j = high;
              while (true) {
                  while (i <= j && arr[i]<=pivot) {
                      i++;
                  }
                  while (i <= j && arr[j]>pivot) {
                      j--;
                  }
                  if (i > j) {
                      break;
                  }
                  std::swap(arr[i], arr[j]);
              }
              std::swap(arr[low], arr[j]);
              return j;
          }
          
          void quickSort(int arr[], int low, int high) {
              if (low < high) {
                  int pi = partition(arr, low, high);
                  quickSort(arr, low, pi - 1);
                  quickSort(arr, pi + 1, high);
              }
          }
      • 归并排序(Merge Sort)

        • 原理:

          • 将数组分成两半,递归地对每一半进行排序。
          • 然后将两个已排序的子数组合并成一个有序的数组。
        • 示例代码:

          void merge(int arr[], int l, int m, int r) {
              int n1 = m - l + 1;
              int n2 = r - m;
              int L[n1], R[n2];
              for (int i = 0; i < n1; i++) {
                  L[i]=arr[l + i];
              }
              for (int int j = 0; j < n2; j++) {
                  R[j]=arr[m + 1+ j];
              }
              int i = 0, j = 0, k = l;
              while (i < n1 && j < n2) {
                  if (L[i]<=R[j]) {
                      arr[k]=L[i];
                      i++;
                  } else {
                      arr[k]=R[j];
                      j++;
                  }
                  k++;
              }
              while (i < n1) {
                  arr[k]=L[i];
                  i++;
                  k++;
              }
              while (j < n2) {
                  arr[k]=R[j];
                  j++;
                  k++;
              }
          }
          
          void mergeSort(int arr[], int l, int r) {
              if (l < r) {
                  int m = l+(r - l)/2;
                  mergeSort(arr, l, m);
                  mergeSort(arr, m + 1, r);
                  merge(arr, l, m, r);
              }
          }

          二、查找算法

        • 线性查找(Linear Search)

          • 原理:

            • 从数组的第一个元素开始,逐个比较元素与要查找的目标值。
            • 如果找到相等的元素,则返回该元素的索引;如果遍历完整个数组都没有找到,则返回 - 1。
          • 示例代码:

            int linearSearch(int arr[], int n, int key) {
                for (int i = 0; i < n; i++) {
                    if (arr[i]==key) {
                        return i;
                    }
                }
                return - 1;
            }

          • 二分查找(Binary Search)

            • 原理:

              • 要求数组是有序的。
              • 每次比较中间元素与目标值,如果相等则返回中间元素的索引。
              • 如果目标值小于中间元素,则在数组的左半部分继续查找;如果目标值大于中间元素,则在数组的右半部分继续查找。
            • 示例代码:

              int binarySearch(int arr[], int l, int r, int key) {
                  while (l <= r) {
                      int mid = l+(r - l)/2;
                      if (arr[mid]==key) {
                          return mid;
                      } else if (arr[mid]<key) {
                          l = mid + 1;
                      } else {
                          r = mid - 1;
                      }
                  }
                  return - 1;
              }

              三、数值计算相关算法

            • 最大公约数(Greatest Common Divisor - GCD) - 欧几里得算法

              • 原理:

                • 对于两个整数 a、b(a>b),a 和 b 的最大公约数等于 b 和 a% b 的最大公约数。
              • 示例代码:

                int gcd(int a, int b) {
                    if (b == 0) {
                        return a;
                    }
                    return gcd(b, a % b);
                }

              • 最小公倍数(Least Common Multiple - LCM)

                • 原理:

                  • 两个数 a 和 b 的最小公倍数等于 a 乘以 b 除以它们的最大公约数(lcm(a,b)=a*b/gcd(a,b))。
                • 示例代码:

                  int lcm(int a, int b) {
                      return a*b/gcd(a, b);
                  }

      • 喜欢的点点关注!下次再给大家分享有用的干货知识

  • 11
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值