嵌入式Linux系统C/C++编程中常用的算法有哪些,分别如何使用,请举例
时间: 2024-01-21 17:19:20 浏览: 99
在嵌入式Linux系统C/C++编程中,常用的算法包括但不限于以下几种:
1. 排序算法:排序算法是编程中最常见的算法之一,嵌入式Linux系统C/C++编程中常用的排序算法有冒泡排序、快速排序、归并排序等。
- 冒泡排序:冒泡排序是一种简单的排序算法,通过比较相邻元素的大小来进行排序。常见的实现方式是使用双重循环,外层循环控制排序的轮数,内层循环控制每轮比较的元素对。代码示例如下:
```c++
void bubble_sort(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]) {
swap(arr[j], arr[j + 1]);
}
}
}
}
```
- 快速排序:快速排序是一种高效的排序算法,通过分治的方式将数组分成两个子数组,再分别对两个子数组进行排序。常见的实现方式是使用递归,每次选择一个基准元素,将小于基准元素的元素放到左边,大于基准元素的元素放到右边,然后递归地对左右两个子数组进行排序。代码示例如下:
```c++
void quick_sort(int arr[], int left, int right)
{
if (left >= right) {
return;
}
int i = left;
int j = right;
int pivot = arr[left];
while (i < j) {
while (i < j && arr[j] >= pivot) {
j--;
}
arr[i] = arr[j];
while (i < j && arr[i] <= pivot) {
i++;
}
arr[j] = arr[i];
}
arr[i] = pivot;
quick_sort(arr, left, i - 1);
quick_sort(arr, i + 1, right);
}
```
- 归并排序:归并排序是一种稳定的排序算法,通过将数组分成若干个子数组,再将子数组两两合并,最终得到一个有序的数组。常见的实现方式是使用递归,每次将数组分成两个子数组,递归地对两个子数组进行排序,然后将两个子数组合并成一个有序的数组。代码示例如下:
```c++
void merge_sort(int arr[], int left, int right)
{
if (left >= right) {
return;
}
int mid = (left + right) / 2;
merge_sort(arr, left, mid);
merge_sort(arr, mid + 1, right);
int i = left;
int j = mid + 1;
int k = 0;
int tmp[right - left + 1];
while (i <= mid && j <= right) {
if (arr[i] <= arr[j]) {
tmp[k++] = arr[i++];
} else {
tmp[k++] = arr[j++];
}
}
while (i <= mid) {
tmp[k++] = arr[i++];
}
while (j <= right) {
tmp[k++] = arr[j++];
}
for (int i = left, k = 0; i <= right; i++, k++) {
arr[i] = tmp[k];
}
}
```
2. 查找算法:查找算法是指在一组数据中查找指定元素的算法,嵌入式Linux系统C/C++编程中常用的查找算法有线性查找、二分查找等。
- 线性查找:线性查找是一种简单的查找算法,通过依次比较数组中的元素来查找指定元素。代码示例如下:
```c++
int linear_search(int arr[], int n, int target)
{
for (int i = 0; i < n; i++) {
if (arr[i] == target) {
return i;
}
}
return -1;
}
```
- 二分查找:二分查找是一种高效的查找算法,适用于有序数组。通过比较中间元素的大小来缩小查找范围,最终找到指定元素。代码示例如下:
```c++
int binary_search(int arr[], int n, int target)
{
int left = 0;
int right = n - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (arr[mid] == target) {
return mid;
} else if (arr[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
}
```
3. 字符串算法:字符串算法是指在字符串中进行查找、匹配、替换等操作的算法,嵌入式Linux系统C/C++编程中常用的字符串算法有KMP算法、Boyer-Moore算法等。
- KMP算法:KMP算法是一种高效的字符串匹配算法,通过预处理模式串构造next数组,来避免不必要的比较。代码示例如下:
```c++
void get_next(char *p, int *next)
{
int len = strlen(p);
int i = 0;
int j = -1;
next[0] = -1;
while (i < len - 1) {
if (j == -1 || p[i] == p[j]) {
i++;
j++;
next[i] = j;
} else {
j = next[j];
}
}
}
int kmp(char *s, char *p)
{
int slen = strlen(s);
int plen = strlen(p);
int i = 0;
int j = 0;
int next[plen];
get_next(p, next);
while (i < slen && j < plen) {
if (j == -1 || s[i] == p[j]) {
i++;
j++;
} else {
j = next[j];
}
}
if (j == plen) {
return i - j;
} else {
return -1;
}
}
```
- Boyer-Moore算法:Boyer-Moore算法是一种高效的字符串匹配算法,通过从右向左匹配模式串,来避免不必要的比较。代码示例如下:
```c++
int max(int a, int b)
{
return a > b ? a : b;
}
void get_bad_char(char *p, int *bc)
{
int len = strlen(p);
for (int i = 0; i < 256; i++) {
bc[i] = -1;
}
for (int i = 0; i < len; i++) {
bc[p[i]] = i;
}
}
void get_good_suffix(char *p, int *gs)
{
int len = strlen(p);
int suff[len];
suff[len - 1] = len;
int f = 0, g;
for (int i = len - 2; i >= 0; i--) {
if (i > f && suff[len - 1 - f + i] < i - f) {
suff[i] = suff[len - 1 - f + i];
} else {
if (i < f) {
f = i;
}
g = f - i;
while (f >= 0 && p[f] == p[len - 1 - g - f]) {
f--;
}
suff[i] = g - f;
}
}
for (int i = 0; i < len; i++) {
gs[i] = len;
}
for (int i = len - 1; i >= 0; i--) {
if (suff[i] == i + 1) {
for (int j = 0; j < len - i - 1; j++) {
if (gs[j] == len) {
gs[j] = len - i - 1;
}
}
}
}
for (int i = 0; i < len - 1; i++) {
gs[len - 1 - suff[i]] = len - 1 - i;
}
}
int boyer_moore(char *s, char *p)
{
int slen = strlen(s);
int plen = strlen(p);
int bc[256];
int gs[plen];
get_bad_char(p, bc);
get_good_suffix(p, gs);
int i = 0;
while (i <= slen - plen) {
int j;
for (j = plen - 1; j >= 0 && s[i + j] == p[j]; j--);
if (j < 0) {
return i;
} else {
i += max(gs[j], j - bc[s[i + j]]);
}
}
return -1;
}
```
以上是嵌入式Linux系统C/C++编程中常用的算法及其示例。当然,在实际应用中,开发者还需要根据具体需求选择合适的算法。
阅读全文