【C语言初阶】排序算法之“冒泡排序”

简介: 1.冒泡排序简介冒泡排序(Bubble Sort),是一种较简单的排序算法。

1.冒泡排序简介

冒泡排序(Bubble Sort),是一种较简单的排序算法


它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。


这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。

冒泡排序的核心思想是:相邻两个元素进行比较,如果不满足条件就交换,最后得到降序或升序。

2.直接上冒泡例子

废话不多说,直接上例子。

例如一组无序的数{11,8,26,57,34,45,22,19},让它排成升序,具体实现如下:

先上图

image.png

如图 1 所示是对无序表的第一次起泡排序,最终将无序表中的最大值 57 找到并存储在表的最后一个位置。具体实现过程为:

体实现过程为:

  1. 首先 11 和 8 比较,由于 11>8,所以两者交换位置,即从(1)到(2)的转变;
  2. 然后继续 11 和 26 进行比较,由于 11<26,所以不移动位置;
  3. (3)中 26 同 57 比较得知,两者也不需要移动位置;
  4. 直至(4),57 同 34 进行比较,57>34 ,两者交换位置,如(5)所示;
  5. 同样 57>45(5)、57>22(6)、57>19(7),所以经过一次冒泡排序,最终在无序表中找到一个最大值 57,第一次冒泡结束;

由于 57 已经判断为最大值,所以第二次冒泡排序时就需要找出除 57 之外的无序表中的最大值,比较过程和第一次完全相同。

image.png

经过第二次冒泡,最终找到了除 57 之外的又一个最大值 45,比较过程完全一样,这里不再描述。

通过一趟趟的比较,一个个的“最大值”被找到并移动到相应位置,直到检测到表中数据已经有序,或者比较次数等同于表中含有记录的个数,排序结束,这就是起泡排序。

3.冒泡排序代码如下(升序)

1.#include<stdio.h>
int main()
{
  int i, j, max;
  int arr[] = { 11, 8, 26, 57, 34, 45, 22, 19 };
  int sz = sizeof(arr) / sizeof(arr[0]);//数组元素个数
  for (i = 0; i < sz-1; i++)//趟数,一共 sz-1 趟
  {
    for (j = 0; j < sz - i - 1; j++)//每一趟冒泡的过程
    {
      if (arr[j] > arr[j + 1])  //交换两个值
      {
        max = arr[j];
        arr[j] = arr[j + 1];
        arr[j + 1] = max;
      }
    }
  }
  printf("排序后的数组为:\n");
  for (i = 0; i < sz; i++)
  {
    printf("%d ", arr[i]);
  }
  return 0;
}

4.冒泡排序优化

1.冒泡排序优化

文章说到代码还可以继续优化,是什么原因呢?

我们观察发现当数组已经有序了(假设是升序),如{1,2,3,4,5,6,7,8},我们写的程序依旧继续进行下一轮的比较,直到所有的数进行比较、排序完,很明显后面的比较没有意义的这就会让这些代码的效率降低。

在这种情况下,我们就不必要对有序的数进行排序,以此减少代码执行的次数,提高代码的效率。

因此,我们可以设置一个 flags ,如果已经排好序了就令 flags==0 结束循环;如果不是有序的就令 flags==1 继续执行。

2.代码如下(优化后)

1.#include<stdio.h>
int main()
{
  int i, j, max;
  int flags;
  int arr[] = { 11, 8, 26, 57, 34, 45, 22, 19 };
  int sz = sizeof(arr) / sizeof(arr[0]);//数组元素个数
  for (i = 0; i < sz-1; i++)//趟数,一共 sz-1 趟
  {
    flags = 0;// 每次开始冒泡前,初始化 flags 值为 0
    for (j = 0; j < sz - i - 1; j++)//每一趟冒泡的过程
    {
      if (arr[j] > arr[j + 1])  //交换两个值
      {
        max = arr[j];
        arr[j] = arr[j + 1];
        arr[j + 1] = max;
        flags = 1;//不是有序,程序继续执行
      }
    }
    if (flags == 0)
    {
      break;//有序,结束此次循环
    }
  }
  printf("排序后的数组为:\n");
  for (i = 0; i < sz; i++)
  {
    printf("%d ", arr[i]);
  }
  return 0;
}

5.最最后

文章到这结束了,希望这篇文章能帮助到你!

感谢支持!!!

相关文章
|
算法 数据处理 C语言
C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合
本文深入解析了C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合,旨在帮助读者掌握这一高效的数据处理方法。
727 1
|
9月前
|
搜索推荐 算法 Go
Go语言数组排序(冒泡排序法)—— 用最直观的方式掌握排序算法
本案例介绍使用冒泡排序对整数数组进行升序排序的实现方法,涵盖输入处理、错误检查与排序逻辑。通过代码演示和算法解析,帮助理解排序原理及Go语言切片操作,为学习更复杂排序算法打下基础。
|
搜索推荐 C语言
【排序算法】快速排序升级版--三路快排详解 + 实现(c语言)
本文介绍了快速排序的升级版——三路快排。传统快速排序在处理大量相同元素时效率较低,而三路快排通过将数组分为三部分(小于、等于、大于基准值)来优化这一问题。文章详细讲解了三路快排的实现步骤,并提供了完整的代码示例。
743 4
|
9月前
|
搜索推荐
冒泡排序与其它排序算法比较
本内容比较了冒泡排序、选择排序和插入排序的特性。三者时间复杂度均为O(n²),但交换次数和稳定性不同。冒泡排序稳定,交换次数多,可优化至O(n);选择排序不稳定,交换次数少;插入排序交换次数最少,且二者均为稳定排序。对于有序数组,冒泡和插入可优化提升效率。
176 0
|
搜索推荐 Python
利用Python内置函数实现的冒泡排序算法
在上述代码中,`bubble_sort` 函数接受一个列表 `arr` 作为输入。通过两层循环,外层循环控制排序的轮数,内层循环用于比较相邻的元素并进行交换。如果前一个元素大于后一个元素,就将它们交换位置。
348 67
|
存储 算法 数据管理
C语言算法复杂度
【10月更文挑战第20天】
166 5
C语言算法复杂度
|
存储 算法 程序员
C 语言递归算法:以简洁代码驾驭复杂逻辑
C语言递归算法简介:通过简洁的代码实现复杂的逻辑处理,递归函数自我调用解决分层问题,高效而优雅。适用于树形结构遍历、数学计算等领域。
|
存储 缓存 算法
C语言在实现高效算法方面的特点与优势,包括高效性、灵活性、可移植性和底层访问能力
本文探讨了C语言在实现高效算法方面的特点与优势,包括高效性、灵活性、可移植性和底层访问能力。文章还分析了数据结构的选择与优化、算法设计的优化策略、内存管理和代码优化技巧,并通过实际案例展示了C语言在排序和图遍历算法中的高效实现。
532 2
|
机器学习/深度学习 算法 数据挖掘
C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出
本文探讨了C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出。文章还介绍了C语言在知名机器学习库中的作用,以及与Python等语言结合使用的案例,展望了其未来发展的挑战与机遇。
501 1
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
593 1