Python算法与数据结构之冒泡排序实例详解

陈默
陈默
发布时间:2026-10-13 | 6人浏览过
原创

本文详细解析冒泡排序算法,涵盖其基本工作原理、图解演示及Python与C语言代码实现。重点介绍通过标志位进行的性能优化策略,分析最优与最坏时间复杂度,并论证其稳定性。适合初学者掌握基础排序逻辑及进阶优化技巧。

一、冒泡排序介绍

冒泡排序(Bubble Sort)是一种基础的排序算法。该算法通过重复遍历待排序数列,依次比较相邻的两个元素,若发现顺序错误则进行交换。遍历过程持续进行,直到某次遍历中无需再发生交换,表明数列已完全有序。其名称来源于较小的元素会像气泡一样逐渐“浮”至数列顶端的过程。

二、冒泡排序原理

  1. 比较相邻的两个元素。若前一个元素大于后一个元素,则交换两者的位置。
  2. 对数列中每一对相邻元素执行上述比较与交换操作,从第一对开始直至最后一对。经过这一轮处理后,数列末尾的元素将是当前未排序部分的最大值。
  3. 针对所有剩余元素重复执行上述步骤,但无需再处理已排序到末尾的元素。
  4. 持续对剩余元素数量逐渐减少的数列执行上述步骤,直到没有任何一对相邻数字需要比较为止。

三、冒泡排序图解

四、冒泡排序总结

若数列包含N个数据,则总共需要进行N-1趟比较。

在第i趟比较中,需要进行N-i次比较操作(其中i从1开始计数)。例如,对于7个数据的数列,第四趟需要比较 7-4 = 3次。

五、冒泡排序python代码实现


def bubble_sort(numlist):
 # 需要排列的数据个数
 N = len(numlist)
 # i 控制一共需要多少趟 N-1
 for i in range(N-1):
  # j 控制每趟需要比较多少次(因为i是从0开始,所以N-i-1)
  for j in range(N-i-1):
   # 判断j和j+1两个位置的数据大小
   if numlist[j]>numlist[j+1]:
    # 交换(交换的代码有很多种写法)
    temp = numlist[j]
    numlist[j] = numlist[j+1]
    numlist[j+1] = temp
   
list = [19,2,13,8,34,25,7]
print("排序前list = %s"%list)
bubble_sort(list)
print("排序后list = %s"%list)

运行结果为:

排序前list = [19, 2, 13, 8, 34, 25, 7] 排序后list = [2, 7, 8, 13, 19, 25, 34]

六、冒泡排序C语言代码实现


#include <stdio.h>
// 创建一个冒泡函数,需要传递一个数组,和数组的长度
void bubble_sort(int array[],int arrayLength)
{
 // i 控制一共需要循环多少趟,
 for (int i=0; i<arrayLength-1; i++)
 {
  // j 控制每趟循环多少次
  for (int j=0; j<arrayLength-i-1; j++)
  {
   //判断j和j+1位置上数的大小
   if (array[j]>array[j+1])
   {
    //交换
    int temp = array[j];
    array[j] = array[j+1];
    array[j+1] = temp;
   }
  }
 }
}

int main(int argc, const char * argv[])
{
 // 函数的声明
 void bubble_sort(int array[],int arrayLength);
 // 创建一个数组
 int numArray[] = {19,2,13,8,34,25,7};
 //进行排序
 bubble_sort(numArray,7);
 
 printf("打印排序后的数组是:\n");
 for (int i=0; i<7; i++)
 {
  printf("%d ",numArray[i]);
 }
 return 0;
}

运算结果为:

打印排序后的数组是:

2 7 8 13 19 25 34

七、冒泡排序的优化

基于上述案例,我们已知冒泡排序的基本原理与实现方式。但在处理特定数据(如已有序列)时,可进行优化。例如,对于序列1, 2, 3, 4, 5, 6, 7,其本身已有序。若仅比较一趟后发现无任何元素交换,则说明序列已正确排序,后续循环无需执行,从而提升程序效率。实现方式是在代码中增加判断逻辑,检查当前趟次是否发生交换。

python代码实现如下:


def bubble_sort(numlist):
 # 需要排列的数据个数
 N = len(numlist)
 # i 控制一共需要多少趟 N-1
 for i in range(N-1):
  
  # 定义一个变量,用于记录是否在本趟中发生了交换
  isChange = 0
  
  # j 控制每趟需要比较多少次(因为i是从0开始,所以N-i-1)
  for j in range(N-i-1):
   # 判断j和j+1两个位置的数据大小
   if numlist[j]>numlist[j+1]:
    # 交换(交换的代码有很多种写法)
    temp = numlist[j]
    numlist[j] = numlist[j+1]
    numlist[j+1] = temp
    # 只要发生了交换,我们就改变isChange的值为1
    isChange = 1
  
  # 只要isChange =0说明已经是正确顺序了,直接break即可
  if isChange == 0:
   break
   
list = [19,2,13,8,34,25,7]
print("排序前list = %s"%list)
bubble_sort(list)
print("排序后list = %s"%list)

运行结果为:

排序前list = [19, 2, 13, 8, 34, 25, 7] 排序后list = [2, 7, 8, 13, 19, 25, 34]

C语言代码实现如下:


#include <stdio.h>
// 创建一个冒泡函数,需要传递一个数组,和数组的长度
void bubble_sort(int array[],int arrayLength)
{
 // i 控制一共需要循环多少趟,
 for (int i=0; i<arrayLength-1; i++)
 {
  //定义一个变量,用于记录是否在本趟中发生了改变
  int isChange = 0;
  // j 控制每趟循环多少次
  for (int j=0; j<arrayLength-i-1; j++)
  {
   //判断j和j+1位置上d数的大小
   if (array[j]>array[j+1])
   {
    //交换
    int temp = array[j];
    array[j] = array[j+1];
    array[j+1] = temp;
    // 只要发生了交换,我们就改变isChange的值为1
    isChange = 1;
   }
  }
  // 只要isChange =0说明已经是正确顺序了,直接break即可
  if (isChange == 0)
  {
   break;
  }
 }
}

int main(int argc, const char * argv[])
{
 // 函数的声明
 void bubble_sort(int array[],int arrayLength);
 // 创建一个数组
 int numArray[] = {19,2,13,8,34,25,7};
 //进行排序
 bubble_sort(numArray,7);
 
 printf("打印排序后的数组是:\n");
 for (int i=0; i<7; i++)
 {
  printf("%d ",numArray[i]);
 }
 return 0;
}

运行结果为:

打印排序后的数组是:

2 7 8 13 19 25 34

八、冒泡排序的时间复杂度

最优时间复杂度:O(n),表示遍历一次后发现无需交换任何元素,排序结束。 最坏时间复杂度:O(n^2)。

九、冒泡排序算法的稳定性

冒泡排序通过调整小元素前移或大元素后移来实现排序,比较与交换仅发生在相邻元素之间。若两个元素相等,则不会发生交换;即使通过前面的交换使相等元素相邻,也不会再次交换。因此,相同元素的相对前后顺序保持不变,冒泡排序属于稳定排序算法。

侯哥语录:我曾经是一个职业教育者,现在是一个自由开发者。我希望我的分享可以和更多人一起进步。分享一段我喜欢的话给大家:"我所理解的自由不是想干什么就干什么,而是想不干什么就不干什么。当你还没有能力说不得时候,就努力让自己变得强大,拥有说不得权利。"

总结

以上所述是小编给大家介绍的python算法与数据结构之冒泡排序实例详解,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表