排序算法之冒泡排序(C语言)

一、原理讲解

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

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

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

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

上图中显示的每轮排序之后得到的结果,其中第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

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值