以下是 C++ 中一些常用的算法:
一、排序算法
-
冒泡排序(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)
)。
- 两个数 a 和 b 的最小公倍数等于 a 乘以 b 除以它们的最大公约数(
-
示例代码:
int lcm(int a, int b) { return a*b/gcd(a, b); }
-
-
-
-
-
- 喜欢的点点关注!下次再给大家分享有用的干货知识
-
-