白骑士的C语言教学高级篇 3.4 C语言中的算法

系列目录

上一篇:白骑士的C语言教学高级篇 3.3 并发与多线程

        算法是解决问题的核心。无论是排序、搜索,还是递归与动态规划,算法的选择和实现对程序的效率和性能有着重要影响。本节将介绍几种常见的算法,包括排序算法、搜索算法,以及递归和动态规划的应用。

排序算法

        排序算法是将一组数据按特定顺序排列的过程。常见的排序算法有冒泡排序、选择排序、插入排序、快速排序和归并排序等。下面是几种常见排序算法的介绍和示例代码。

冒泡排序

        冒泡排序通过多次遍历数组,每次比较相邻的元素,如果顺序错误就交换,直到整个数组有序,例如:

#include <stdio.h>


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]) {
                // 交换arr[j]和arr[j+1]
                int temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
    }
}


int main() {
    int arr[] = {64, 34, 25, 12, 22, 11, 90};
    int n = sizeof(arr)/sizeof(arr[0]);

    bubbleSort(arr, n);

    printf("排序后的数组: ");

    for (int i = 0; i < n; i++)
        printf("%d ", arr[i]);

    return 0;
}

选择排序

        选择排序每次从未排序部分中选出最小(或最大)的元素,放到已排序部分的末尾,例如:

#include <stdio.h>


void selectionSort(int arr[], int n) {
    for (int i = 0; i < n-1; i++) {
        int minIndex = i;

        for (int j = i+1; j < n; j++) {
            if (arr[j] < arr[minIndex])
                minIndex = j;
        }

        int temp = arr[minIndex];
        arr[minIndex] = arr[i];
        arr[i] = temp;
    }
}


int main() {
    int arr[] = {64, 25, 12, 22, 11};
    int n = sizeof(arr)/sizeof(arr[0]);
    selectionSort(arr, n);

    printf("排序后的数组: ");

    for (int i = 0; i < n; i++)
        printf("%d ", arr[i]);

    return 0;
}

快速排序

        快速排序通过选择一个基准元素,将数组分成两部分,一部分所有元素比基准元素小,另一部分所有元素比基准元素大,然后递归地对这两部分进行排序,例如:

#include <stdio.h>


void swap(int* a, int* b) {
    int t = *a;
    *a = *b;
    *b = t;
}


int partition (int arr[], int low, int high) {
    int pivot = arr[high];
    int i = (low - 1);

    for (int j = low; j <= high-1; j++) {
        if (arr[j] < pivot) {
            i++;

            swap(&arr[i], &arr[j]);
        }
    }

    swap(&arr[i + 1], &arr[high]);

    return (i + 1);
}


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);
    }
}


int main() {
    int arr[] = {10, 7, 8, 9, 1, 5};
    int n = sizeof(arr)/sizeof(arr[0]);

    quickSort(arr, 0, n-1);

    printf("排序后的数组: ");

    for (int i = 0; i < n; i++)
        printf("%d ", arr[i]);

    return 0;
}

搜索算法

        搜索算法用于在数据集合中查找特定元素。常见的搜索算法有线性搜索和二分搜索。

线性搜索

        线性搜索逐一比较数据集合中的每个元素,直到找到目标元素或搜索完所有元素,例如:

#include <stdio.h>


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

    return -1;
}


int main() {
    int arr[] = {2, 3, 4, 10, 40};
    int x = 10;
    int n = sizeof(arr)/sizeof(arr[0]);
    int result = linearSearch(arr, n, x);

    if(result == -1)
        printf("元素不在数组中\n");

    else
        printf("元素在数组中的索引: %d\n", result);

    return 0;
}

二分搜索

        二分搜索在有序数组中查找目标元素,通过反复将搜索范围缩小为一半,直到找到目标元素或搜索范围为空,例如:

#include <stdio.h>


int binarySearch(int arr[], int l, int r, int x) {
    while (l <= r) {
        int m = l + (r - l) / 2;

        if (arr[m] == x)
            return m;

        if (arr[m] < x)
            l = m + 1;

        else
            r = m - 1;
    }

    return -1;
}


int main() {
    int arr[] = {2, 3, 4, 10, 40};
    int x = 10;
    int n = sizeof(arr)/sizeof(arr[0]);
    int result = binarySearch(arr, 0, n-1, x);

    if(result == -1)
        printf("元素不在数组中\n");

    else
        printf("元素在数组中的索引: %d\n", result);

    return 0;
}

递归与动态规划

递归

        是指一个函数调用其自身。递归算法通常用于解决分治问题,例如斐波那契数列和阶乘,例如:

#include <stdio.h>


int fibonacci(int n) {
    if (n <= 1)
        return n;

    return fibonacci(n - 1) + fibonacci(n - 2);
}


int main() {
    int n = 9;

    printf("Fibonacci数列的第%d项是: %d\n", n, fibonacci(n));

    return 0;
}

动态规划

        是一种将复杂问题分解为更小子问题的技术,通过记忆化或表格化存储子问题的结果,避免重复计算,提升算法效率,例如:

#include <stdio.h>


int fibonacci(int n) {
    int f[n+1];
    f[0] = 0;
    f[1] = 1;

    for (int i = 2; i <= n; i++) {
        f[i] = f[i-1] + f[i-2];
    }

    return f[n];
}


int main() {
    int n = 9;

    printf("Fibonacci数列的第%d项是: %d\n", n, fibonacci(n));

    return 0;
}

总结

        排序算法、搜索算法以及递归与动态规划是C语言编程中不可或缺的重要部分。通过掌握这些算法,将能够高效地处理和操作数据,解决复杂的编程问题。学习和理解这些基础算法,不仅有助于提升编程能力,也为解决实际问题打下坚实的基础。

下一篇:白骑士的C语言教学高级篇 3.5 性能优化​​​​​​​

相关推荐

  1. 骑士C语言教学高级 3.4 C语言算法

    2024-07-09 21:22:03       21 阅读
  2. 骑士C++教学高级 3.2 多线程与并发

    2024-07-09 21:22:03       19 阅读
  3. 骑士C++教学基础 1.3 控制流

    2024-07-09 21:22:03       22 阅读
  4. 骑士C++教学基础 1.5 数据结构

    2024-07-09 21:22:03       18 阅读
  5. 骑士C++教学进阶 2.3 模板

    2024-07-09 21:22:03       27 阅读
  6. 骑士C++教学附加 5.2 代码规范与最佳实践

    2024-07-09 21:22:03       15 阅读
  7. C/C++】C语言高级编程

    2024-07-09 21:22:03       53 阅读
  8. 骑士PyCharm教学目录

    2024-07-09 21:22:03       17 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-09 21:22:03       49 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-09 21:22:03       53 阅读
  3. 在Django里面运行非项目文件

    2024-07-09 21:22:03       42 阅读
  4. Python语言-面向对象

    2024-07-09 21:22:03       53 阅读

热门阅读

  1. flask-apscheduler 定时任务被执行两次

    2024-07-09 21:22:03       19 阅读
  2. 部署Gunicorn + Flask应用到Docker

    2024-07-09 21:22:03       20 阅读
  3. VB 爬虫技术

    2024-07-09 21:22:03       20 阅读
  4. Self-Instruct构造Prompt的例子

    2024-07-09 21:22:03       20 阅读
  5. Oracle-查询表空间使用率很慢

    2024-07-09 21:22:03       21 阅读
  6. git reset HEAD^1

    2024-07-09 21:22:03       15 阅读
  7. 数据的统计探针:SKlearn中的统计分析方法

    2024-07-09 21:22:03       18 阅读
  8. 数据的完美贴合:SKlearn中的数据拟合方法全解

    2024-07-09 21:22:03       19 阅读
  9. Python基础学习笔记(十二)——字典

    2024-07-09 21:22:03       22 阅读