冒泡排序

时间:2022-12-29 17:05:56
一、冒泡排序的原理
二、冒泡排序的逻辑解释
三、代码实现
四、代码优化

一、冒泡排序的原理

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;

}