经典算法(一)----冒泡排序----图解法让你快速入门

引言

     只要设计到数据,就会涉及到数据的排序问题,比如给你随机给你五个整数  3,1,5,2,4 。让你从小到大进行排序,那我们该怎样才是实现对这些整数的排序呢 ?

    答案是多种多样的,比如用冒泡排序、选择排序、堆排序、归并排序、快速排序等等,这些排序方法都可以实现对整数排序,而这篇文章要讲的就是冒泡排序

本文将从以下几个问题对冒泡排序进行分析和讲解:

  1. 什么是冒泡排序?
  2. 冒泡排序的大概过程是什么?
  3. 怎样用代码实现冒泡排序?
  4. 冒泡排序的代码详解。

一、什么是冒泡排序?

下面看百度百科对冒泡排序的定义:

冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。

它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。

这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。

 

冒泡冒泡,顾名思义它的排序过程就像冒泡一样,它的基本思想就是:对所有的数进行查找,找到最大的数放到最后面, 接下来除了那个最大的数,再对剩余的数进行查找,把剩余的数中最大的数放到倒是第二后面,直到所有的数都排序完成。

二、冒泡排序的大概过程是什么?

下面拿一个例子说明冒泡排序的大概过程。

冒泡排序的基本思想就是:首先选出来最大的数放到最后面,再选出来第二大的放到最大的数前面,按照前面的方法直到排序完成。

下面来说用冒泡排序对3,1,5,2,4进行排序(从小到大排序)

  1. 我们首先要选出来这个五个数中最大,选择方法:首先看第一个数3和第二个数1,拿着3和1比较,发现3>1,交换他俩的位置,这时候这一组数就变成了1,3,5,2,4
  2. 再看交换后的第二个数3和第三个数5,发现3<5.符合从小到大,不用交换顺序。
  3. 再看交换后的第三个数5和第四个数2,发现5>2,交换他俩的位置,这时候这一组数就变成了1,3,2,5,4.
  4. 再看交换后的第四个数5和第五个数4,发现5>4,交换他俩的位置,这时候这一组数就变成了1,3,2,4,5
  5. 上面的这四步算是第一轮查找,把最大的数字5放到了最后面。下面在及性能第二轮查找
  6. 首先看第一个数1和第二个数3,发现1<3,符合条件,不用交换顺序
  7. 再看第二个数3和第三个数2,发现3>2,交换他俩的位置,这时候这一组数就变成了1,2,3,4,5。
  8. 再看第三个数3和第四个数4,发现3<4,符合条件,不用交换顺序。
  9. 到现在为止第二轮的查找结束(不用对第五个数5进行比较,因为他已经是最大的了),通过上面的6-8,把第二大的数4放到了倒数第二个位置。接下来按照上面方法再进行查找即可。

总结:假设一共有n个数,那么需要n-1上面的查找操作(每一次都会把 “最大的数放到后面”,等进行n-1一次之后,剩余的1个数不用比较也是最小的数了),而且每一次查找过程中,比较相邻两个数的次数还不一样,第一次需要比较n-1次,第二次需要n-2(最后一个数已经确定,不用比较了)。后面的每次查找都比前面查找的比较次数少一,即第i次查找过程,需要比较n-i次(重要!!!)。

下面再看一个网上冒泡排序的动图:

 三、怎样用代码实现冒泡排序?

通过上面对3,1,5,2,4的排序过程讲解,我们需要明确已知的三个条件

  1. 我们要排序的数组有哪些数?数组长度为多少?
  2. 我们要查找的次数为多少?
  3. 每次查找,我们需要比较的次数为多少?

搞清楚了上面三个条件,我们下面看代码:

#include<iostream>
using namespace std;
//冒泡排序函数    稳定 
void BubbleSort(int arr[],int len)
{
	int temp;
	for(int i=0;i<len-1;i++)
	{
		for(int j=0;j<len-i-1;j++)
		{
			if(arr[j]>arr[j+1])//交换这两个数 
			{
				temp=arr[j];
				arr[j]=arr[j+1];
				arr[j+1]=temp;
			}
		}
	}
}
//输出数组的值
void printf(int arr[],int len)
{
	for(int i=0;i<len;i++)
		cout<<arr[i]<<" ";
	cout<<endl;
}
int main()
{
	//要排序的数组 
	int arr[]={3, 44,38, 5,47,15,36,26,27,2 ,46,4 ,19,50,48};
	int len=15;//要排序的数组长度 
	
	//排序 
	BubbleSort(arr,len);
	
	//输出 
	printf(arr,len);
	return 0;
}

运行结果:

 

四、冒泡排序的代码详解

  1. 上面代码写了两个函数,一个是printf函数,这个是输出排序后的数组。
  2. 另一个函数就BubbleSort函数,在这个函数里面有一个二重循环,外层循环的的次数就是要查找的次数,内层循环的次数的就是要比较的次数,刚好对应上面说的(这里数组下标是从0开始的)。
  3. 如果对上面代码有疑问,自己可以按照前面的过程,模拟一边对3,1,4,5,2的排序过程,就知道代码是怎样执行的了 。

本文参考以及引用:

  1. 百度百科
  2. 图片动画

如果对其他的算法还有兴趣,可以点击下面的链接。

  1. 经典算法(一)----冒泡排序----图解法让你快速入门

  2. 经典算法(二)----选择排序----图解法让你快速入门

  3. 经典算法(三)----插入排序----图解法让你快速入门

  4. 经典算法(四)----希尔排序----图解法让你快速入门

  5. 经典算法(五)----归并排序----图解法让你快速入门

  6. 经典算法(六)----快速排序----图解法让你快速入门

  7. 经典算法(七)----  堆排序 ----图解法让你快速入门

  8. 经典算法(八)----计数排序----图解法让你快速入门

  9. 经典算法(九)----基数排序----图解法让你快速入门

  10. 经典算法(十)----  桶排序  ----图解法让你快速入门

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值