一、原理讲解

所谓排序,就是将一串无序数据,按照其中某个或某些关键的大小,递增或递减排列起来的操作,排序算法,就是如何使得记录按照要求排列的方法。

下面对冒泡排序进行详解。这里我们先对冒泡二字进行初步的说明。冒泡指的就是水下的气泡,从水底向上冒的过程,这气泡在上升的过程,气泡在压力的作用下,逐渐表大。如下图所示:

排序算法之冒泡排序(C语言)-编程之家

冒泡算法实现过程就如这冒泡的过程,算法核心是相邻的两个数进行比较,将大的/小的向后移。

假定有一个数组arr[10] = {80, -20, 36, 1, 6, 8, 65, 4, 33, 16};

排序算法之冒泡排序(C语言)-编程之家

上图中显示的每轮排序之后得到的结果,其中第0轮是原始数据,下面以第一轮为例进行详细讲解:

记住冒泡排序的算法核心是相邻的两个数,两两比较,大的/小的向后移,并且气泡是从水底往上冒的,所以我们按照以下顺序必须排序:

第一次:arr[0]与arr[1]进行比较,arr[0] > arr[1]  所以arr[0]的数据和arr[1]的数据进行交换,arr[0] = -20  arr[1] = 80

第二次:arr[1]与arr[2]进行比较,arr[1] > arr[2]  所以arr[1]的数据和arr[2]的数据进行交换,arr[1] = 36  arr[2] = 80

第三次:arr[2]与arr[3]进行比较,arr[2] > arr[3]  所以arr[2]的数据和arr[3]的数据进行交换,arr[2] = 1  arr[3] = 80

第四次:arr[3]与arr[4]进行比较,arr[3] > arr[4]  所以arr[3]的数据和arr[4]的数据进行交换,arr[3] = 6  arr[4] = 80

第五次:arr[4]与arr[5]进行比较,arr[4] > arr[5]  所以arr[4]的数据和arr[5]的数据进行交换,arr[4] = 8  arr[5] = 80

第六次:arr[5]与arr[6]进行比较,arr[5] > arr[6]  所以arr[5]的数据和arr[6]的数据进行交换,arr[5] = 65  arr[6] = 80

第七次:arr[6]与arr[7]进行比较,arr[6] > arr[7]  所以arr[6]的数据和arr[7]的数据进行交换,arr[6] = 4  arr[7] = 80

第八次:arr[7]与arr[8]进行比较,arr[7] > arr[8]  所以arr[7]的数据和arr[8]的数据进行交换,arr[7] = 33  arr[8] = 80

第九次:arr[8]与arr[9]进行比较,arr[8] > arr[9]  所以arr[8]的数据和arr[9]的数据进行交换,arr[8] = 16  arr[9] = 80

总计比较了9次(数组总数 – 轮数),至此我们就完成了第一轮排序,把无序数组中最大的数移到了无序数组最后一位。

这里我们就可以总结一下冒泡算法的实现过程,利用两两相比并将大的数后移的算法核心,每轮排序中将无序数组中的最大数,移动到无序数组的最后一位。

然后接下来就是按照这个方法将剩下的数据进行排序,这里有一点需要我们注意的是,我们每次都会将无序数数组最大的数移动到最后,那么最后面的数据就是有序的,所以对于无序数组Arr[N],我们需要进行(N – 1)轮排序,第 i 轮排序需要比较          (N – 1 – i)次。

 

二、具体代码

/*
函数名:int BubbleSort(int data[], int n);
函数功能:使用冒泡排序的方法,将数组按从小到大排序
函数参数:data[]:数组首地址n:参与排序的数据个数
函数返回值:函数成功排序数组返回0,失败返回-1
*/int BubbleSort(int data[], int n)
{if (NULL == data){printf("\n data is null in %s\n", __FUNCTION__);return NULL_ERR;}int i = 0;int j = 0;int k = 0;int temp = 0;for (i = 0; i < n -1; i++){for (j = 0; j < n -1 - i; j++){if (data[j] > data[j + 1]){temp = data[j];data[j] = data[j + 1];data[j + 1] = temp;}}}return OK;}

这里我们需要注意的是,对于arr[N]的数组,我们需要进行(N – 1)轮比较,因为最后一轮的时候只有一个数,自身就有序,每轮比较只需要比较(N – 1 – i)次,是因为比较完 i 轮之后,数组最后 i 个数据是有序的。具体看原理讲解的图上红框中的数据。

 

仓促成文,不当之处,尚祈方家和读者批评指正。联系邮箱1772348223@qq.com