冒泡排序

「数据结构与算法学习笔记」如何理解冒泡排序(六)

大家好,今天给大家分享一下,如何理解冒泡排序(Bubble Sort),冒泡排序是一种简单的排序算法,就是不断地交换”大数“的位置达到排序的目的。因此不断出现”大数“,类似水泡不断地出现,因此被形象的称为冒泡排序算法。

举个例子,对于数组[5, 3, 8, 6, 4]来说,其第一轮排序的逻辑如下:

首先从第一个数开始,5和3进行比较,发现5大于3,于是交换位置,此时数组变为[3, 5, 8, 6, 4]。然后从第二个数开始,5和8进行比较,发现5小于8,于是不进行交换,此时数组变为[3, 5, 8, 6, 4]。继续比较,8和6进行比较,发现8大于6,于是交换位置,此时数组变为[3, 5, 6, 8, 4]。接着,8和4进行比较,发现8大于4,于是交换位置,此时数组变为[3, 5, 6, 4, 8]。到这里我们比较了4次。

接下来进行第二轮排序:

基于上一轮的排序结果[3, 5, 6, 4, 8],我们再次从第一个数开始比较,3和5进行比较,发现3小于5,不进行交换,此时数组变为[3, 5, 6, 4, 8]。接着,5和6进行比较,发现5小于6,不进行交换,此时数组变为[3, 5, 6, 4, 8]。然后,6和4进行比较,发现6大于4,于是交换位置,此时数组变为[3, 5, 4, 6, 8],这里就不需要做比较了,因为第一轮排序找到了最大的数,第二轮我们比较了3次。

依次类推,经过四轮排序(数组长度减1),我们就可以得到一个有序的有效到达的排序 [3, 4, 5, 6, 8],大家可以基于这个思路自己推算下。为了方便大家理解,大家可以参照图一理解冒泡排序的过程。

接下来我们还是通过代码的形式,使用 JS 和 Python 进行实现,我们可以从头两两排序,先把最大的数字挑出来,也可以从数组的尾部开始两两比较,先将较小的数字找出来。

冒泡排序的时间复杂度是 O(n^2),所以它不是很适合排序大数据。
#数据结构# #算法# #程序员# #前端# #Python#

冒泡排序算法

冒泡排序起泡排序,别名“冒泡排序”,该算法的核心思想是将无序表中的所有记录,通过两两比较关键字,得出升序序列或者降序序列。

更多学习资料Q群:569268376

例如,对无序表{49,38,65,97,76,13,27,49}进行升序排序的具体实现过程如图 1 所示:

图 1 第一次起泡

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

首先 49 和 38 比较,由于 38<49,所以两者交换位置,即从(1)到(2)的转变;然后继续下标为 1 的同下标为 2 的进行比较,由于 49<65,所以不移动位置,(3)中 65 同 97 比较得知,两者也不需要移动位置;直至(4),97 同 76 进行比较,76<97,两者交换位置,如(5)所示;同样 97>13(5)、97>27(6)、97>49(7),所以经过一次冒泡排序,最终在无序表中找到一个最大值 97,第一次冒泡结束;由于 97 已经判断为最大值,所以第二次冒泡排序时就需要找出除 97 之外的无序表中的最大值,比较过程和第一次完全相同。

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

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

完整代码#include <stdio.h>//交换 a 和 b 的位置的函数void swap(int *a, int *b);int main(){ int array[8] = {49,38,65,97,76,13,27,49}; int i, j; int key; //有多少记录,就需要多少次冒泡,当比较过程,所有记录都按照升序排列时,排序结束 for (i = 0; i < 8; i++){ key=0;//每次开始冒泡前,初始化 key 值为 0 //每次起泡从下标为 0 开始,到 8-i 结束 for (j = 0; j+1<8-i; j++){ if (array[j] > array[j+1]){ key=1; swap(&array[j], &array[j+1]); } } //如果 key 值为 0,表明表中记录排序完成 if (key==0) { break; } } for (i = 0; i < 8; i++){ printf("%d ", array[i]); } return 0;}void swap(int *a, int *b){ int temp; temp = *a; *a = *b; *b = temp;}运行结果为:

13 27 38 49 49 65 76 97

总结使用起泡排序算法,其时间复杂度同实际表中数据的无序程度有关。若表中记录本身为正序存放,则整个排序过程只需进行 n-1(n 为表中记录的个数)次比较,且不需要移动记录;若表中记录为逆序存放(最坏的情况),则需要 n-1趟排序,进行 n(n-1)/2 次比较和数据的移动。所以该算法的时间复杂度为O(n2)。

c语言冒泡排序代码

C语言冒泡排序算法

用冒泡排序法对任意输入的 10 个数按照从小到大的顺序进行排序。实现过程:(1) 通过两个 for 循环实现冒泡排序的全过程,外层 for 循环决定冒泡排序的趟数,内层 for 循环决定每趟所进行两两比较的次数。

(2) 程序代码如下:

运行结果:

请输入10个数:66 32 23 45 25 5 15 69 46 37排序后的顺序是: 5 15 23 25 32 37 45 46 66 69

技术要点:

本实例要求用冒泡法对 10 个数由小到大进行排序,冒泡法的基本思路是,如果要对 n 个数进行冒泡排序,那么要进行 n-1 趟比较,在第 1 趟比较中要进行 n-j 次两两比较,在第 j 趟比较中要进行 n-j 次两两比较。从这个基本思路中就会发现,趟数决定了两两比较的次数,这样就很容易将两个 for 循环联系起来了。