两数交换、冒泡排序、简单排序、斐波拉契

一、两数交换
二、冒泡排序
三、简单排序
四、斐波拉契数列

一、两数交换

有几种方法可以在不使用第三个变量的情况下交换两个数的值。以下是其中一些方法:

  1. 加法和减法
    通过加法和减法运算,可以在不使用额外变量的情况下交换两个数的值。

    a = a + b;
    b = a - b;
    a = a - b;
    
  2. 异或操作
    使用位异或(XOR)操作可以在不使用额外变量的情况下交换两个数的值。这是最常见的方法,因为它既简单又高效。

    a = a ^ b;
    b = a ^ b;
    a = a ^ b;
    

    这种方法的原理是基于异或操作的性质,即 x ^ x 的结果为0,0 ^ y 的结果为y,以及交换律。因此,ab 的值将成功交换。

  3. 加法和减法(仅限整数)
    对于整数,还可以使用加法和减法来交换两个数的值。

    a = a + b;
    b = a - b;
    a = a - b;
    

    请注意,这种方法在处理大整数时可能会导致溢出问题。

  4. 位操作(仅限整数)
    对于整数,还可以使用位操作来交换两个数的值。这种方法与异或操作类似,但可以更细粒度地控制交换。

    a = a & b;
    b = a | b;
    a = a ^ b;
    

    这种方法的原理是使用位操作来逐位交换。

上述方法中,异或操作是最常见和最常用的方法,因为它简单且高效,并适用于大多数数据类型。但请注意,这些方法可能会受到溢出和其他数据类型限制的影响,因此在使用时要小心谨慎。

二、冒泡排序

以下是完整的冒泡排序的示例代码,包括对整个数组的排序:

#include <stdio.h>

void swap(int *x, int *y) {
    int temp = *x;
    *x = *y;
    *y = temp;
}

void bubbleSort(int arr[], int n) {
    int i, j;
    for (i = 0; i < n - 1; i++) {
        for (j = 0; j < n - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                // 交换 arr[j] 和 arr[j+1]
                swap(&arr[j], &arr[j + 1]);
            }
        }
    }
}

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

    printf("原始数组: ");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }

    bubbleSort(arr, n);

    printf("\n排序后的数组: ");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }

    return 0;
}

这段代码包括了 swap 函数和 bubbleSort 函数,以及一个在 main 函数中使用冒泡排序来排序整个数组的示例。当你运行这段代码时,它将对 arr 数组进行冒泡排序,并输出排序后的结果。

三、简单排序

以下是完整的选择排序的示例代码:

#include <stdio.h>

void swap(int *x, int *y) {
    int temp = *x;
    *x = *y;
    *y = temp;
}

void selectionSort(int arr[], int n) {
    int i, j, minIndex;
    for (i = 0; i < n - 1; i++) {
        // 找到未排序部分中最小元素的索引
        minIndex = i;
        for (j = i + 1; j < n; j++) {
            if (arr[j] < arr[minIndex]) {
                minIndex = j;
            }
        }
        // 交换最小元素和当前元素
        swap(&arr[i], &arr[minIndex]);
    }
}

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

    printf("原始数组: ");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }

    selectionSort(arr, n);

    printf("\n排序后的数组: ");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }

    return 0;
}

这段代码包括了一个 swap 函数,用于交换两个整数的值,以及一个 selectionSort 函数,用于实现选择排序。在 main 函数中,我们定义了一个整数数组,对其进行排序,然后输出排序后的结果。

选择排序是一种简单的排序算法,它通过重复选择未排序部分中的最小元素,并将其放在已排序部分的末尾来实现排序。这个过程一直持续到整个数组排序完成。选择排序的时间复杂度是 O(n^2),因此在大型数据集上不是最有效的排序算法。

四、斐波拉契数列

斐波那契数列(Fibonacci sequence)是一个经典的数学数列,它定义如下:

  1. 第一个数为 0。
  2. 第二个数为 1。
  3. 从第三个数开始,每个数都是前两个数的和。

数学表达式如下:

F(0) = 0
F(1) = 1
F(n) = F(n-1) + F(n-2) (对于 n > 1)

斐波那契数列的前几个数依次为:0, 1, 1, 2, 3, 5, 8, 13, 21,以此类推。

以下是一个使用递归方式计算斐波那契数列的示例代码(虽然递归是一种直观的方法,但不是效率最高的方法):

#include <stdio.h>

int fibonacci(int n) {
    if (n <= 1) {
        return n;
    }
    return fibonacci(n - 1) + fibonacci(n - 2);
}

int main() {
    int n = 10; // 想要计算的斐波那契数列的长度
    printf("斐波那契数列前 %d 个数:\n", n);
    for (int i = 0; i < n; i++) {
        printf("%d ", fibonacci(i));
    }
    printf("\n");

    return 0;
}

在这个示例中,fibonacci 函数使用递归方式计算斐波那契数列中第 n 个数的值。请注意,递归方法在计算大数值时可能会导致性能问题,因为它会重复计算相同的值。有更高效的方法,如使用迭代或存储中间结果的方式来计算斐波那契数列。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咖喱年糕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值