服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C语言中冒泡排序算法详解

C语言中冒泡排序算法详解

2022-08-29 15:25pineapple_py C/C++

大家好,本篇文章主要讲的是C语言中冒泡排序算法详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下

一、算法描述

比较相邻两个元素,如果第一个比第二个大则交换两个值。遍历所有的元素,每一次都会将未排序序列中最大的元素放在后面。假设数组有 n 个元素,那么需要遍历 n - 1 次,因为剩下的一个元素一定是最小的,无需再遍历一次。因此需要两层循环,第一层是遍历次数,第二层是遍历未排序数组。

动图如下:

C语言中冒泡排序算法详解

黄色部分表示已排好序的数组,蓝色部分表示未排序数组

核心代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
 * @brief 冒泡排序
 *
 * @param arr 待排序的数组
 * @param size 数组大小
 */
static void bubble_sort(int *arr, int size)
{
    for (int i = 0; i < size - 1; i++) {
        bool swapped = false; // 设置标记,用于检查是否已排好序
        for (int j = 0; j < size - i; j++)
            if (arr[j] > arr[j + 1]) {
                swap(arr + j, arr + j + 1);
                swapped = true;
            }
        if (!swapped) // 未交换则排序完毕,跳出循环
            break;
    }
}

布尔值 swapped 是一种优化手段,在每次遍历未排序数组之前将其设置为 false 表示还未交换。如果遍历完未排序数组之后其值还是 false 则表示遍历过程种没有发生交换,也就是说数组已经有序,无需再次遍历,跳出循环。

二、算法分析

时间复杂度:O(N2),两层循环

空间复杂度:O(1),交换元素时只用了一个临时变量

最好情况:O(N),有序数组遍历一次后 swapped 为 false 退出循环

最坏情况:O(N2),数组倒序

稳定性:稳定,比较两个元素大小时不包括元素相等的情况,故相等元素的相对位置不变

三、完整代码

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
/**
 * @file bubble_sort.c
 * @date 2022-01-16
 * @author Pineapple (pineapple_cpp@163.com)
 *
 * @brief 冒泡排序
 */
 
#include <assert.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
/**
 * @brief 交换函数
 *
 * @param left 左边的元素
 * @param right 右边的元素
 */
static inline void swap(int *left, int *right)
{
    int temp = *left;
    *left = *right;
    *right = temp;
}
 
/**
 * @brief 冒泡排序
 *
 * @param arr 待排序的数组
 * @param size 数组大小
 */
static void bubble_sort(int *arr, int size)
{
    for (int i = 0; i < size - 1; i++) {
        bool swapped = false; // 设置标记,用于检查是否已排好序
        for (int j = 0; j < size - i; j++)
            if (arr[j] > arr[j + 1]) {
                swap(arr + j, arr + j + 1);
                swapped = true;
            }
        if (!swapped) // 未交换则排序完毕,跳出循环
            break;
    }
}
 
/**
 * @brief 测试函数
 *
 */
static void test()
{
    const int size = rand() % 500; // 生成随机数组大小
    int *arr = (int *)calloc(size, sizeof(int));
 
    // 生成范围 -50 到 49 的随机数组
    for (int i = 0; i < size; i++)
        arr[i] = rand() % 100 - 50;
 
    bubble_sort(arr, size);
 
    for (int i = 0; i < size - 1; i++)
        assert(arr[i] <= arr[i + 1]);
 
    free(arr);
}
 
int main(void)
{
    srand(time(NULL));
    test();
    return 0;
}

总结

到此这篇关于C语言中冒泡排序算法详解的文章就介绍到这了,更多相关C语言冒泡排序内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/pineapple_C/article/details/122524148

延伸 · 阅读

精彩推荐
  • C/C++简单掌握桶排序算法及C++版的代码实现

    简单掌握桶排序算法及C++版的代码实现

    桶排序是将要排序的算法按桶分组排序之后再遍历汇总的一种线性排序算法,下面就让我们来通过小例子简单掌握桶排序算法及C++版的代码实现^^...

    skywangkw9412021-04-08
  • C/C++windows上安装CLion教程及简单使用详解

    windows上安装CLion教程及简单使用详解

    这篇文章主要介绍了windows上安装CLion教程及简单使用,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要...

    木子宣7892021-09-24
  • C/C++OpenCV实现车牌字符分割(C++)

    OpenCV实现车牌字符分割(C++)

    这篇文章主要为大家详细介绍了OpenCV实现车牌字符分割,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    Steven·简谈6232021-10-07
  • C/C++C++ 中virtual 虚函数用法深入了解

    C++ 中virtual 虚函数用法深入了解

    这篇文章主要介绍了C++ 中virtual 虚函数用法深入了解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们...

    静悟生慧4702021-09-16
  • C/C++strcat 函数的使用指南

    strcat 函数的使用指南

    strcat是连接字符串的函数。函数返回指针,两个参数都是指针,第一个参数所指向的内存的地址必须能容纳两个字符串连接后的大小。...

    C语言教程网10282021-03-12
  • C/C++C语言之qsort函数详解

    C语言之qsort函数详解

    这篇文章主要介绍了C语言中qsort函数的用法实例详解的相关资料,希望通过本文能帮助到大家,让大家理解掌握这部分内容,需要的朋友可以参考下...

    可爱的乐乐哥哥11432021-12-22
  • C/C++OpenCV基于背景减除实现行人计数

    OpenCV基于背景减除实现行人计数

    本文主要介绍了如何使用OpenCV C++对视频中的人流量进行统计。文中的示例代码讲解详细,对我们学习OpenCV有一定的帮助,需要的可以了解一下...

    Zero___Chen10702022-08-17
  • C/C++C语言实现简单的三子棋项目

    C语言实现简单的三子棋项目

    这篇文章主要为大家详细介绍了C语言实现简单的三子棋项目,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    还小给个面子11002021-12-09