C语言指针-冒泡排序之旅

文章目录

一、冒泡排序原理

  • 冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地走访要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端(升序排列的情况),就像气泡在水中上浮一样。

二、冒泡排序过程示例

  • 假设我们有一个整数数组arr = {5, 4, 3, 2, 1},我们要对这个数组进行升序排列。

1、第一轮排序

复制代码
 - 比较`arr[0]`和`arr[1]`,即`5`和`4`。因为`5 > 4`,所以交换它们的位置,数组变为`{4, 5, 3, 2, 1}`。
 - 接着比较`arr[1]`和`arr[2]`,即`5`和`3`。因为`5 > 3`,交换位置,数组变为`{4, 3, 5, 2, 1}`。
 - 再比较`arr[2]`和`arr[3]`,即`5`和`2`。因为`5 > 2`,交换位置,数组变为`{4, 3, 2, 5, 1}`。
 - 最后比较`arr[3]`和`arr[4]`,即`5`和`1`。因为`5 > 1`,交换位置,数组变为`{4, 3, 2, 1, 5}`。
 - 经过第一轮排序后,最大的元素`5`已经"浮"到了数组的最后一个位置。

2、第二轮排序

复制代码
 - 比较`arr[0]`和`arr[1]`,即`4`和`3`。因为`4 > 3`,交换位置,数组变为`{3, 4, 2, 1, 5}`。
 - 接着比较`arr[1]`和`arr[2]`,即`4`和`2`。因为`4 > 2`,交换位置,数组变为`{3, 2, 4, 1, 5}`。
 - 再比较`arr[2]`和`arr[3]`,即`4`和`1`。因为`4 > 1`,交换位置,数组变为`{3, 2, 1, 4, 5}`。
 - 经过第二轮排序后,第二大的元素`4`已经"浮"到了倒数第二个位置。

3、第三轮排序

复制代码
 - 比较`arr[0]`和`arr[1]`,即`3`和`2`。因为`3 > 2`,交换位置,数组变为`{2, 3, 1, 4, 5}`。
 - 接着比较`arr[1]`和`arr[2]`,即`3`和`1`。因为`3 > 1`,交换位置,数组变为`{2, 1, 3, 4, 5}`。
 - 经过第三轮排序后,第三大的元素`3`已经"浮"到了倒数第三个位置。

4、第四轮排序

复制代码
 - 比较`arr[0]`和`arr[1]`,即`2`和`1`。因为`2 > 1`,交换位置,数组变为`{1, 2, 3, 4, 5}`。
 - 经过四轮排序后,数组已经完成升序排列。

三、C语言代码实现步骤及程度

  • 以下是一个简单的C语言冒泡排序代码实现:
c 复制代码
#include <stdio.h>

void bubble_sort(int arr[], int n) {
    int i, j, temp;
    for (i = 0; i < n - 1; i++) {
        // 每一轮比较
        for (j = 0; j < n - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                // 交换元素
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

int main() {
    int arr[] = {5, 4, 3, 2, 1};
    int n = sizeof(arr)/sizeof(arr[0]);
    bubble_sort(arr, n);
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}

1、外层循环(for (i = 0; i < n - 1; i++)

复制代码
 - 这个循环控制排序的轮数。对于一个有`n`个元素的数组,最多需要`n - 1`轮排序就可以完成整个数组的排序。
 - 因为每一轮排序都会将当前未排序部分的最大元素"浮"到后面已经排序好的部分,所以每一轮结束后,后面就会多一个已经排序好的元素,
 - 需要排序的部分就会减少一个。

2、内层循环(for (j = 0; j < n - i - 1; j++)

复制代码
 - 这个循环控制每一轮中相邻元素的比较次数。在每一轮排序中,由于最后`i`个元素已经在前面的轮次中排序好了,
 - 所以只需要比较前`n - i - 1`个元素。例如,在第一轮排序中,需要比较`n - 1`次,因为所有元素都还未排序;
 - 在第二轮排序中,只需要比较`n - 2`次,因为最后一个元素已经是最大的了,不需要再参与比较,以此类推。

3、交换元素部分(if (arr[j] > arr[j + 1]) {...}

复制代码
 - 当`arr[j]`大于`arr[j + 1]`时,说明这两个相邻元素的顺序不符合升序要求,需要交换它们的位置。
 - 通过一个临时变量`temp`来实现交换,先将`arr[j]`的值赋给`temp`,然后将`arr[j + 1]`的值赋给`arr[j]`,
 - 最后将`temp`(原来`arr[j]`的值)赋给`arr[j + 1]`,这样就完成了两个元素的交换。
 - 在主函数`main`中,首先定义了一个待排序的数组`arr`,然后通过`sizeof`操作符计算出数组的长度`n`。
 - 接着调用`bubble_sort`函数对数组进行排序,最后通过一个循环打印出排序后的数组元素。
相关推荐
前端摸鱼匠8 小时前
【AI大模型春招面试题11】什么是模型的“涌现能力”(Emergent Ability)?出现条件是什么?
人工智能·算法·ai·自然语言处理·面试·职场和发展
MORE_778 小时前
leecode-合并区间-贪心算法
算法·贪心算法
沈阳信息学奥赛培训8 小时前
#undef 指令 (C/C++)
c语言·开发语言·c++
2401_873204658 小时前
分布式系统安全通信
开发语言·c++·算法
sw12138910 小时前
C++中的代理模式实战
开发语言·c++·算法
ballball~~10 小时前
ISP-CCM(Color Correction Matrix)
图像处理·数码相机·算法
Sunshine for you11 小时前
实时操作系统中的C++
开发语言·c++·算法
中科院提名者11 小时前
BPE 算法的硬核拆解——理解词表(Vocabulary)是如何从零训练出来的,以及字符串是如何被切碎的
算法
「QT(C++)开发工程师」11 小时前
C++11三大核心特性深度解析:类型特征、时间库与原子操作
java·c++·算法
乐分启航11 小时前
SliMamba:十余K参数量刷新SOTA!高光谱分类的“降维打击“来了
java·人工智能·深度学习·算法·机器学习·分类·数据挖掘