C语言------冒泡法排序

一.前情提要

1.介绍

冒泡法排序法:

1)冒泡排序(Bubble Sort)是一种简单的排序算法,它重复地遍历要排序的列表,一次比较相邻的两个元素,并且如果它们的顺序错误就将它们交换过来。重复这个过程直到没有需要交换的元素,即可完成排序。

2)这个算法的名字来自于在排序过程中较大的元素会经由交换“冒泡”到数列的顶端,而较小的元素则会慢慢“沉”到数列的底端。

3)下面是冒泡排序的基本步骤

①比较相邻的两个元素。如果第一个比第二个大(升序排序),则交换它们。

②对每一对相邻元素重复上述步骤,直到没有任何一对元素需要比较。

③重复步骤1和2,直到整个列表都已经排好序。

4)示例图(借鉴了C语言——冒泡排序_冒泡排序c语言-CSDN博客)-----> 如有侵权联系作者删除

二.具体代码

#include <stdio.h>

// 定义冒泡排序函数

void bubbleSort(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[] = {64, 34, 25, 12, 22, 11, 90};

    int n = sizeof(arr) / sizeof(arr[0]);

    int i;

    printf("原始数组: \n");

    for (i = 0; i < n; i++) {

        printf("%d ", arr[i]);

    }

    printf("\n");

    bubbleSort(arr, n);

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

    for (i = 0; i < n; i++) {

        printf("%d ", arr[i]);

    }

    printf("\n");



    return 0;

}

三.代码解析

1.流程:冒泡排序是一种简单的排序算法,bubbleSort()中通过多次遍历数组,比较相邻元素的大小并交换它们,从而将最大的元素逐步“冒泡”到数组的末尾。这个函数接受一个整型数组 arr 和数组的长度 n,并对数组进行排序。具体实现是通过两层嵌套的循环,外层循环控制每一轮的比较次数,内层循环用于比较相邻元素并进行交换。主函数 main(),它定义了一个整型数组 arr,并初始化了一些数据。然后通过 sizeof 运算符计算了数组的长度,并将其赋值给变量 n。接着,它使用 printf() 函数打印出原始数组的内容。然后调用了 bubbleSort() 函数对数组进行排序。最后,再次使用 printf() 函数打印出排序后的数组内容。

2.细节:(为什么 i < n - 1,j < n - i - 1?等)

外层循环的终止条件是 i < n - 1 ,原因是因为在每一轮遍历中,内层循环会比较相邻的两个元素,并将较大的元素向数组的末尾移动。因此,每经过一轮遍历,最大的元素就会被“冒泡”到数组的最后一个位置上。假设数组的长度为 n,在经过 n - 1 轮遍历后,数组中的最后一个元素已经是最大的元素了,不需要再进行比较和交换。因此,外层循环的终止条件是 i < n - 1,这样可以确保在最后一轮遍历时,内层循环不会执行多余的比较和交换操作,提高了算法的效率。

内层循环的终止条件是 j < n - i - 1。因为在每一轮外层循环中,内层循环需要比较相邻的元素,并将较大的元素向右移动,直到最大的元素移动到当前未排序部分的最后一个位置。当外层循环执行到第 i 次时,表示数组的后 i 个元素已经处于正确的位置,无需再参与比较和交换。因此,在内层循环中,需要避免对这些已经排好序的元素进行比较和交换。具体来说,每一轮内层循环中,都会从数组的第一个元素开始比较,直到倒数第 i + 1 个元素为止。因此,内层循环的终止条件是 j < n - i - 1,以确保不会对已经排好序的元素进行多余的比较和交换,提高算法的效率。

n = sizeof(arr) / sizeof(arr[0])的作用是计算数组 arr 的长度。在C 语言中,可以使用 sizeof 运算符来获取变量或类型所占据的字节数。在这里,sizeof(arr) 返回整个数组 arr 占据的字节数,而 sizeof(arr[0]) 返回数组中第一个元素 arr[0] 的字节数。由于数组中的每个元素都是相同类型的,因此数组中每个元素占据的字节数都相同。通过将整个数组的字节数除以一个元素的字节数,可以得到数组中元素的个数,也就是数组的长度。

temp = arr[j];

arr[j] = arr[j + 1];

arr[j + 1] = temp;

这段代码中,首先将数组中索引为 j 的元素的值保存到临时变量 temp 中。然后将数组中索引为 j + 1 的元素的值赋给索引为 j 的位置,实现了将后一个元素的值赋给前一个元素。最后,将临时变量 temp 中保存的值赋给索引为 j + 1 的位置,实现了将前一个元素的值赋给后一个元素,从而完成了两个元素值的交换。这段代码通常用于实现冒泡排序算法中的元素交换操作。

  • 20
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值