一、冒泡排序的原理
二、冒泡排序的逻辑解释
三、代码实现
四、代码优化
一、冒泡排序的原理
1、比较相邻的元素。如果第一个比第二个大,就交换他们两个。2、对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。3、针对所有的元素重复以上的步骤,除了最后一个。4、持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
二、冒泡排序的逻辑解释
有十个数字:10,9,8,7,6,5,4,3,2,1,将他们进行排序,排成升序。
先比较10与9,10>9,交换10与9,这十个数字变成:9,10,8,7,6,5,4,3,2,1;再比较10与8,10>8,交换10与8,这十个数字又变成:9,8,10,7,6,5,4,3,2,1.......以此类推,直至这一行数字变成:9,8,7,6,5,4,3,2,1,10(完成一趟冒泡排序,交换了9对数字),然后开始第二趟冒泡排序:先比较9与8,9>8,交换9与8,这十个数字变成:8,9,7,6,5,4,3,2,1,10......以此类推,直至这一行数字变成:8,7,6,5,4,3,2,1,9,10(完成第二趟冒泡排序,交换了8对数字)。并以此类推,直至这一行数字变成1,2,3,4,5,6,7,8,9,10,完成升序排序,总共需要9趟。
以此总结:n个元素需要n-1趟冒泡排序(10个元素需要9趟冒泡排序)
一趟冒泡排序中,n个需要排序的数字中,需要交换n-1对数字(10个数字需要排序,共交换了9对)
三、代码实现
1、创建一个函数bubble_sort,先确定冒泡排序的次数
2、再写每次冒泡排序要实现的内容
3,排序后,再打印出来
#include<stdio.h>
bubble_sort(int arr[],int sz)
{
int i=0,j=0,tmp=0;
for(i=0;i<sz-1;i++)//确定冒泡排序的次数
{
for(j=0;j<sz-1-i;j++)//每一次冒泡排序
{
if(arr[j]>arr[j+1])
{
tmp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=tmp;
}
}
}
}
int main()
{
int arr[]={10,9,8,7,6,5,4,3,2,1};
int sz=sizeof(arr)/sizeof(arr[0]);
int i=0;
bubble_sort(arr,sz);
for(i=0;i<sz;i++)
{
printf("%d ",arr[i]);
}
return 0;
}
(这个代码效率其实是不高的,当给的一组数字是1,2,3,4,5,6,7,8,9,10时,这不需要再排序了,但还进行一个一个的比较)
四、代码优化
定义int flag=0;,假设这一趟要排的数据已经有序
#include<stdio.h>
void bubble_sort(int arr[],int sz)
{
int tmp=0;
int j=0,i=0;
for(i=0;i<sz-1;i++) //确定冒泡排序的次数
{
int flag=1; //假设这一趟要排序的数据已经有序
for(j=0;j<sz-1-i;j++) //每一趟冒泡排序
{
if(arr[j]>arr[j+1])
{
tmp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=tmp;
flag=0; //本趟排序的数据其实不完全有序
}
}
if(flag==1) //针对数组是0,1,2,3,4,5,6,7,8,9时,加上这句,能提升效率
{
break; //当条件满足时,用break跳出for循环
}
}
}
int main()
{
int arr[]={9,8,7,6,5,4,3,2,1,0};
int sz=sizeof(arr)/sizeof(arr[0]);
bubble_sort(arr,sz);
int i=0;
for(i=0;i<sz;i++)
{
printf("%d ",arr[i]);
}
return 0;
}