这篇文章主要为大家介绍了冒泡排序的基本原理以及代码实现,文中会尽量使用通俗的语言和图片让你一看就懂,清晰明了,有需要的朋友可以借鉴参考学习,希望对你有所帮助。
下面我们就来介绍一下关于冒泡排序的相关内容。
排序就是将集合中的元素按某种顺序排列的过程。比如说一个整型数组中的元素按照升序或者降序排序;一个城市可以按照入口、面积或者邮政编码排序。
而冒泡排序则是排序方式的一种,本文将会以将一个整型数组元素按升序排序的例子向大家详细介绍冒泡排序,如:
排序前:arr[10]={4,6,1,2,5,10,8,7,9,3},排序后:arr[10]={1,2,3,4,5,6,7,8,9,10}
冒泡排序会对数组进行多次遍历,每次遍历都会比较相邻的元素,将不符合顺序的元素进行交换。每一轮遍历都会将下一个最大值放到正确的位置。我们可以这么看,每个元素都通过“冒泡”找到自己所属的位置。
下图展示了冒泡排序的第一轮遍历过程,深色的是正在比较的元素,如果数组里面有n个元素,那么第一轮遍历就要进行n-1次比较。在遍历的过程中,最大的元素会一直往后面挪,直到遍历过程结束,此时最大值已经处于正确位置了。
第二轮遍历开始,因为最大值已经处于正确位置了,此时还剩下n-1个元素需要排序,也就是说要比较n-2次。
每一轮遍历都会把下一个最大值放在正确位置,所以需要遍历的轮数就是n-1次,完成n-1次之后,最小的元素肯定也在正确位置上了,如下图:
冒泡函数代码实现:
#include<iostream>
using namespace std;
//冒泡函数代码实现
void bubble_sort(int* arr,int len)
{
int i=0;
int j=0;
int temp=0;
for(i=0;i<len-1;i++)//外循环
{
for(j=0;j<len-1-i;j++)//内循环
{
if(arr[j]>arr[j+1])//如果当前元素大于下一个元素,则进入if语句中,进行元素交换
{
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
}
int main()
{
//新建数组,并初始化
int arr[10]={4,6,1,2,5,10,8,7,9,3};
//统计数组元素个数
int len=sizeof(arr);
bubble_sort(arr,len);
system("pause");
return 0;
}
相信肯定有朋友在上图中发现,在第七次遍历后,arr数组就已经排好序,也就是说,在下一轮遍历中,没有元素交换。根据这个,我们可以优化一下程序,在每一轮遍历之后,判断在上一轮遍历中是否有元素交换,有交换,则继续遍历;没有交换,就跳出循环,即结束遍历过程。
优化后的程序:
//函数定义
//冒泡排序函数
void bubble_sort(int arr[],int len)
{
int i=0;
int j=0;
int temp=0;
int a=0;
for(i=0;i<len-1;i++) //外循环
{
a=0; //每进行一次外循环,都要将a初始化为0;
for(j=0;j<len-1-i;j++) //内循环
{
//如果当前元素大于下一个元素,则进入if语句中,进行元素交换
if(arr[j]>arr[j+1])
{
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
a++; //记录这次内循环交换元素的次数。
}
}
//如果a=0,说明在刚刚那次的内循环里面,数组元素没有进行交换,元素已经排好序。
if(a==0)
{
break;//跳出外循环,排序完成
}
}
}
int main()
{
//新建数组,并初始化
int arr[10]={4,6,1,2,5,10,8,7,9,3};
//统计数组元素个数
int len=sizeof(arr);
bubble_sort(arr,len);
system("pause");
return 0;
}
关于冒泡排序的相关内容就介绍到这了,希望这篇文章对你有所帮助。