冒泡排序
我理解的冒泡排序分为两种排序(降序和升序)也就是从大到小排,还是从小到大排。他们每一轮循环,相邻的两个数字相互比较,它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
本文以以升序为例,但最后会告诉大家升序以及降序的公式,咱们可以套用。
现在让你们更好地理解冒泡排序,以升序(从小到大)为例,有一个动态图。
以下图为实例,以及详细讲解,先贴上代码 其实也有通用公式哦见最后!!!
#include<stdio.h>
int main()
{
int a[10] = { 54,32,71,79,69,13,98,7,44,66 };
int i, j,k,temp;
for (i = 0; i < 9; i++)
{
for (j = 0; j <= 9 - i; j++)
//你是不是会疑惑这里为什么是9-i?而不是其他的数字?下面会详细讲解
{
if (a[j]>a[j + 1])
{
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
printf("最后的顺序是:\n");
for (i = 0; i < 10; i++)
{
printf("%d ", a[i]);
}
return 0;
}
输出的结果就是如下:
下面来详细讲解中间那一段
for (i = 0; i <9; i++)//外层循环是比较的轮数,数组内有10个数,那么就应该比较10-1=9轮
{
for (j = 0; j <= 9 - i; j++)//内层循环比较的是当前一轮的比较次数
{
if (a[j] > a[j + 1])//相邻两个数如果逆序,则交换位置
{
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
下面是升序的通用公式 你们可以套用
for( i=0;i<n-1; i++)
{
//每轮比较前n-1-i个,已排序好的最后i个不用比较
for(j=0; j<n-1-i; j++)
{
if(a[j] > a[j+1])
{
temp = a[j];
a[j] = a[j+1];
a[j+1]=temp;
}
}
}
上面都是以升序为例的,下面咱们来写个降序(从大到小)的吧,其实很简单,只需要把其中的一个>改成<就完成啦!见下图
下面是升序的通用公式 你们可以套用
for( i=0;i<n-1; i++)
{
//每轮比较前n-1-i个,已排序好的最后i个不用比较
for(j=0; j<n-1-i; j++)
{
if(a[j] < a[j+1])
{
temp = a[j];
a[j] = a[j+1];
a[j+1]=temp;
}
}
}
快去试试吧!是不是很神奇???