【C语言】冒泡排序(图解)

复制代码
  🌈write in front :

🔍个人主页 : @啊森要自信的主页

🌈作者寄语 🌈: 小菜鸟的力量不在于它的体型,而在于它内心的勇气和无限的潜能,只要你有决心,就没有什么事情是不可能的。

欢迎大家关注🔍点赞👍收藏⭐️留言📝>希望看完我的文章对你有小小的帮助,如有错误,可以指出,让我们一起探讨学习交流,一起加油鸭。


冒泡排序

冒泡排序:它重复地走访要排序的数列,一次比较两个相邻的元素,如果它们的顺序错误就把它们交换过来。重复地进行直到没有再需要交换,也就是说该数列已经排序完成。

下面是冒泡排序的步骤:

  1. 从第一个元素开始,依次比较相邻的两个元素,如果顺序不对则交换它们。
  2. 继续比较相邻的元素,直到最后一个元素,这样一轮比较下来,最大的元素就会被交换到最后的位置。
  3. 接着重复上述步骤,但是不包括已经排序好的最后一个元素,因为它们已经是最大的了。
    重复以上步骤,直到所有元素都排好序为止。

对数组 arr[] = { 66, 34, 25, 12, 22, 11, 98 }进行冒泡排序



i=0,j=5,第一趟,交换了6次;
i=1, j=4,第二趟,交换了5次,
i=2, j=3,第三趟,交换了4次;
...以此类推
结论:
7个元素每走一趟,交换少一次,j少一次,i+1

下面是冒泡排序的步骤:

从第一个元素开始,依次比较相邻的两个元素,如果顺序不对则交换它们。

继续比较相邻的元素,直到最后一个元素,这样一轮比较下来,最大的元素就会被交换到最后的位置。

接着重复上述步骤,但是不包括已经排序好的最后一个元素,因为它们已经是最大的了。

重复以上步骤,直到所有元素都排好序为止。

代码实现:

c 复制代码
#include <stdio.h>

void bubbleSort(int arr[], int n) 
{
		//i为趟数
    for (int i = 0; i < n - 1; i++) //arr[]7个元素
    {
        for (int j = 0; j < n - i - 1; j++) 
        {
            if (arr[j] > arr[j + 1]) 
            {
                // 交换arr[j]和arr[j+1]
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

int main() 
{
    int arr[] = { 66, 34, 25, 12, 22, 11, 98 };
    int n = sizeof(arr) / sizeof(arr[0]);
    bubbleSort(arr, n);
    printf("排序后的数组: \n");
    for (int i = 0; i < n; i++) 
    {
        printf("%d ", arr[i]);
    }
    return 0;
}

因为冒泡排序比较次数和交换次数都比较多,当数据量很大时,效率比较低。

优化:如果在一次排序中没有发生交换,则表示数组已经排好序了,可以提前结束排序。

使用Flag看他有没有进入交换,交换后就改为

c 复制代码
#include <stdio.h>

void bubbleSort(int arr[], int n) 
{
    for (int i = 0; i < n - 1; i++) 
    {
        int flag = 1;//假设这⼀趟已经有序了
        for (int j = 0; j < n - i - 1; j++) 
        {
            if (arr[j] > arr[j + 1]) 
            {
                flag = 0;//发⽣交换就说明,⽆序
                
                // 交换arr[j]和arr[j+1]
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
        if (flag == 1)//这⼀趟没交换就说明已经有序,后续⽆序排序了
            break;

    }
}

int main() 
{
    int arr[] = { 66, 34, 25, 12, 22, 11, 98 };
    int n = sizeof(arr) / sizeof(arr[0]);
    bubbleSort(arr, n);
    printf("排序后的数组: \n");
    for (int i = 0; i < n; i++) 
    {
        printf("%d ", arr[i]);
    }
    return 0;
}
相关推荐
草莓熊Lotso8 分钟前
【数据结构初阶】--算法复杂度的深度解析
c语言·开发语言·数据结构·经验分享·笔记·其他·算法
KyollBM14 分钟前
【CF】Day75——CF (Div. 2) B (数学 + 贪心) + CF 882 (Div. 2) C (01Trie | 区间最大异或和)
c语言·c++·算法
CV点灯大师29 分钟前
C++算法训练营 Day10 栈与队列(1)
c++·redis·算法
GGBondlctrl1 小时前
【leetcode】递归,回溯思想 + 巧妙解法-解决“N皇后”,以及“解数独”题目
算法·leetcode·n皇后·有效的数独·解数独·映射思想·数学思想
武子康1 小时前
大数据-276 Spark MLib - 基础介绍 机器学习算法 Bagging和Boosting区别 GBDT梯度提升树
大数据·人工智能·算法·机器学习·语言模型·spark-ml·boosting
武子康1 小时前
大数据-277 Spark MLib - 基础介绍 机器学习算法 Gradient Boosting GBDT算法原理 高效实现
大数据·人工智能·算法·机器学习·ai·spark-ml·boosting
CodeOfCC1 小时前
c语言 封装跨平台线程头文件
linux·c语言·windows
Andrew_Xzw2 小时前
数据结构与算法(快速基础C++版)
开发语言·数据结构·c++·python·深度学习·算法
momo卡2 小时前
MinGW-w64的安装详细步骤(c_c++的编译器gcc、g++的windows版,win10、win11真实可用)
c语言·c++·windows