数据结构与算法之冒泡排序图文详解包含例题(基于C语言)

      大家好,我是小智!

什么是冒泡排序

      冒泡排序也被称为起泡排序,该排序算法的原理就是经过一系列的交换实现的,也就是用第一个元素和第二个元素进行比较,如果第一个元素的值大于第二个元素则两者位置互换,否则不交换。然后第二个元素和第三个元素比较.......最后序列中最大的元素被交换到了序列的尾部,这样就完成了一轮交换,经过n轮交换之后,就可以得到一个有序序列。

为什么叫“冒泡排序”

      冒泡排序就是重复“从序列右边开始比较相邻两个数字的大小,再根据结果交换两个数字的位置”这一操作的算法,也就是从右往左交换。在这个过程中,数字会像泡泡一样,慢慢从右往左“浮”到序列的顶端,所以这个算法才被称为“冒泡排序”。

冒泡排序的图文详解

image

image

image

image

冒泡排序的比较次数以及时间复杂度分析

      在冒泡排序中,第 1 轮需要比较 (n - 1) 次,第 2 轮需要比较(n - 2) 次……第 (n - 1)轮需要比较 1 次。因此总的比较次数为 (n - 1) +(n - 2) +…+1 ≈ \(n^2\) /2。这个比较次数恒定为该数值,和输入数据的排列顺序无关。
      不过,交换数字的次数和输入数据的排列顺序有关。假设出现某种极端情况,如输入数据正好以从小到大的顺序排列,那么便不需要任何交换操作;反过来,输入数据要是以从大到小的顺序排列,那么每次比较数字后都要进行交换。因此,冒泡排序的时间复杂度为 \(O(n^2)\)
      注意:设计冒泡排序算法的时候排序结束的条件应该是一轮排序过程中没有发生元素交换。

例题

题目:设计一个程序,要求用户通过键盘依次输入10个随机且不相同的整数,然后利用冒泡排序实现整数序列的升序排列。

函数实现(重点)

//冒泡排序函数实现
void BubbleSort(int Buf[],int BufSize)
{
    //1.循环比较元素,需要比较n轮
    for (int n = 1; n <= BufSize; ++n)
    {
        int temp = 0;   //临时存储交换值

        //2.每轮需要比较m轮
        for (int m = 0; m < BufSize-n; ++m)
        {
            //3. 借助第三者,数组元素两两之间进行比较
            if (Buf[m] > Buf[m+1])
            {
                temp     = Buf[m];
                Buf[m]   = Buf[m+1];
                Buf[m+1] = temp;
            }
        }
    }
}

思路详解

image

      如上图,srand函数和rand函数是C语言中的随机数生成函数,其中srand函数用于初始化随机数种子,而rand函数用于生成随机数。
      首先在 main 函数中使用 srand(time(NULL)) 设置随机种子,确保每次运行生成不同的随机数序列;然后通过 while (count < 10) 循环不断调用 rand() % 100 生成 0~99 范围内的随机数,并在写入前用简单的线性查重(遍历已填充的 Buf[0..count-1])保证数组中每个数互不相同,直到收集到恰好 10 个随机数。接着打印出这组“无序”数组,直观展示初始状态。调用 BubbleSort(Buf, count) 时,函数内部通过两层循环:外层控制轮次(共 count-1 轮),内层在未排序区间 0 到 count-n-1 之间两两比较并交换,将每轮的最大元素“气泡”到末尾,从而实现原地、稳定的排序。排序完成后,再次遍历打印数组即可看到由乱序到有序的对比效果。

完整代码

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

//冒泡排序函数实现
void BubbleSort(int Buf[],int BufSize)
{
    //1.循环比较元素,需要比较n轮
    for (int n = 1; n <= BufSize; ++n)
    {
        int temp = 0;   //临时存储交换值

        //2.每轮需要比较m轮
        for (int m = 0; m < BufSize-n; ++m)
        {
            //3. 借助第三者,数组元素两两之间进行比较
            if (Buf[m] > Buf[m+1])
            {
                temp     = Buf[m];
                Buf[m]   = Buf[m+1];
                Buf[m+1] = temp;
            }
        }
    }
}

int main(void)
{
    int Buf[10] = {0};
    int count = 0;

    //1.初始化随机种子
    srand(time(NULL));

    //2.生成随机树
    while (count <10)
    {
        int RandomNum  = rand() % 100;
        int NumIfExist = 0;

        //3.检查是否存在
       for (int i = 0; i < count; i++)
       {
            if (Buf[i] == RandomNum)
            {
                NumIfExist = 1;
                break;
            }
       }

        //4.将随机数写入数组
        if (!NumIfExist)
        {
            Buf[count++] = RandomNum;
        }
    }

        //5.打印随机数生成是数组
        printf("冒泡排序前的无序数组:\n");

        for (int i = 0; i < count; i++)
        {
            printf("%2d  ",Buf[i]);
        }

        printf("\n");

        //6.进行冒泡排序
        BubbleSort(Buf,10);

        //7.打印经过冒泡排序处理后的数组
        printf("冒泡排序后的数组:\n");
        for (int i = 0; i < count; i++)
        {
            printf("%2d  ",Buf[i]);
        }

        printf("\n");

    return 0;
}

运行结果

image

posted @ 2025-05-09 14:53  努力赚钱的小智  阅读(201)  评论(0)    收藏  举报