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`函数对数组进行排序,最后通过一个循环打印出排序后的数组元素。
相关推荐
XH华1 小时前
C语言第九章字符函数和字符串函数
c语言·开发语言
CoovallyAIHub1 小时前
线性复杂度破局!Swin Transformer 移位窗口颠覆高分辨率视觉建模
深度学习·算法·计算机视觉
点云SLAM1 小时前
Eigen中Dense 模块简要介绍和实战应用示例(最小二乘拟合直线、协方差矩阵计算和稀疏求解等)
线性代数·算法·机器学习·矩阵·机器人/slam·密集矩阵与向量·eigen库
renhongxia12 小时前
大模型微调RAG、LORA、强化学习
人工智能·深度学习·算法·语言模型
DdduZe2 小时前
8.19作业
数据结构·算法
PyHaVolask2 小时前
链表基本运算详解:查找、插入、删除及特殊链表
数据结构·算法·链表
高山上有一只小老虎2 小时前
走方格的方案数
java·算法
吧唧霸2 小时前
golang读写锁和互斥锁的区别
开发语言·算法·golang