冒泡排序

一、算法原理

冒泡排序是一种常用的排序算法,属于稳定排序法,其时间复杂度为O(n^2)。
冒泡排序法的原理就是从前向后依次比较相邻两个元素的大小,大元素后沉,类似于水中的泡泡逐步上浮的过程,随着泡泡逐渐接近水面,水中压强逐渐减小,水泡体积逐渐增大,因此成为冒泡排序。
冒泡排序法包括多趟排序过程,每一趟排序都是从数组的第一个元素开始,以步长为1的增量依次对相邻的两个元素进行比较大小,反序的话则交换此二元素。

Demo:

假设有数据如下表所示:数组记为data

 

第一趟排序:
从下标为1的元素开始,向后依次比较相邻元素大小。首先比较data[1]和data[2],此时data[1] < data[2],因此不用交换元素。

 

 

 之后比较data[2]和data[3]的大小,此时数据反序,需要交换

 

 

第二趟排序:
和第一趟排序一样,仍旧从数组的第一个元素开始向后依次进行比较大小。但是由于经过第一趟排序之后,最大的元素已经到了最后的位置,因此第二趟排序就截止到数组的倒数第二个位置。

 

 

 至此,该数组的冒泡排序结束。从上述演示过程可以看出,具有n个元素的数组使用冒泡排序法进行排序,需要进行n-1趟排序,每一趟排序都冒出剩余元素中的最大值,放到剩余元素的末尾。

 

二、冒泡排序算法流程图

 

 

三、冒泡排序算法之C程序

 1 #include<stdio.h>
 2 
 3 
 4 int a[15030];
 5 int main() {
 6     int n;
 7     scanf("%d", &n);
 8 
 9     for (int i = 0; i < n; i ++) scanf("%d", &a[i]);
10 
11     //冒泡排序
12 
13     for (int i = 1; i <= n - 1; i ++) { //循环次数
14         for (int j = 0; j < n - i; j ++) { //内层循环
15             if (a[j] > a[j + 1]) { //判断是否需要交换
16                 //有没有发现这跟第一次作业的交换a, b很像
17                 int t;
18                 t = a[j];
19                 a[j] = a[j + 1];
20                 a[j + 1] = t;
21             }
22         }
23     }
24 
25     for (int i = 0; i < n; i ++) printf("%d ", a[i]);
26 
27     return 0;
28 }

 

posted @ 2022-09-27 18:42  Luli&  阅读(90)  评论(0)    收藏  举报