(图中给出的数据全是建立在数组的基础上的!!!)
在说冒泡排序前,咱们需要知道冒泡的两个特点:
1、排序是按照升序去排的(从大到小排列的)。
2、从第一个元素开始和相邻的两个元素进行的比较的。(咱直接上图)
从图中我们可以看到这组数据中最大的数字9经过九次相邻的比较排到了最后的位置(这样的结果我们称为一趟完整的冒泡);至此我们可以发现一个问题,那就是一轮冒泡我们将数字放到了对应的位置。(那我们就可以认为是一趟就可以排序好一个元素)
对此我们可以使用一个for循环来控制趟数:
int l=0;(元素个数)
int n=0;
for(n=0;n<l-1;n++)
{
}
对于第一层for中的循环条件“l-1”,我们是这样理解的:那就是我们假设有3个数字要进行从小到大的比较排列,那我们就是需要比较两次就可以得到这三个数的排序,那这两次的次数是3-1得到的2;所以当我们有l个数字的时候那我们不就是得到次数是l-1啦。
现在咱们再看一张图:
可以看出这张图片,我们第二趟把第二大的数字放到倒数第二的位置 ,这也验证了咱们前面的结论:一趟就可以排序好一个元素!对此我们还可以发现一个规律那就是比较的次数是有如下的规律的:
趟数+1,比较次数-1!
对此我们就可以用一个for循环控制比较的次数:
int a=0;
for(a=0;a<-1-n;a++)
{
}
对于a<l-1-n,(l是一组数据的元素的总数,n是控制趟数的变量,下面会给出完整的代码!)我们可以代一个数试一下这个条件,假设是将9 8 7 6 5 4 3 2 1 0 这一组数中的9完成一次排序,那么它的比较次数就是a<10-1-1,那么a<8就是比较了九次。
最后就是给出我们的冒泡的结构啦:
int temp=0;
if(a1>a2)
{
a1=temp;
a1=a2;
a2=temp;
}
对于判断条件:a1>a2,根据冒泡的特点是升序,因此要是a1<a2我们就没必要排序了,因为它就是一个升序的状态,所以只有当a1>a2时我们才要改变他们的位置。
那我们最后理解上面的逻辑就可以写出一下的代码了:
#include<stdio.h>
int main()
{
int arr[]={9,8,7,6,5,4,3,2,1};
int len=sizeof(arr)/sizeof(arr[0]);//这里的len就是算出元素的总个数。
int n=0;
for(n=0;n<len-1;n++)//第一层控制趟数
{
int i=0;
for(i=0;i<len-1-n;i++)//控制比较的次数
{
int temp=0;
if(arr[i]>arr[i+1])
{
temp=arr[i];
arr[i]=arr[i+1]
arr[i+1]=temp;
}
}
}
int a=0;
for(a=0;a<len;a++)
{
printf("%d ",arr[a]);
}
return 0;
}