排序算法之-冒泡排序
冒泡排序是一种交换排序,其基本思想是:两两比较相邻的记录的关键字,如果反序则交换,直到没有反序为止。
看着概念理解肯定有点晦涩,因此我提议举一个例子,例如李三是小学一年级的同学,老师组织他们去春游,可是出去了肯定要排好队伍,以彰显我们的霸气,故老师要求同学们排好队伍,然而年少无知的少年胡乱占了一列,身高最矮的李三身由于体虚弱被挤到了最后一个,很现实啊适者生存,杨老师看了甚是恼火,于是他亲自给学生们排队,他首先从李三开始,将李三和前面的同学依依比较,再经过一番比较后李三同学顺利找到了他的位置,因此最矮的上升到了第一的位置,接下来比较未排序李三前面的同学,若身高比他高则再将前面的同学和前面的同学比较利用同样的方法依次比较,几分钟之后队列已经排好,整装待发去旅游。。。。
也许这个例子还是无法理解,那么我们再举一个实际的例子数组a={5,4,3,2,1};现在需要对其进行排序
第一次比较后的展示图为:
第二次比较后的展示图为:
第三次比较后的展示图为:
第四次比较后的展示图为:
通过上面的演示大家应该体会到了冒泡法的基本思想,下面我们通过一段代码验证我们的方法看是否可行。
从下往上比较:
#include<stdio.h>
#include<stdlib.h>
void show(int *p,int length)
{
int i;
printf("*********\n");
for(i=0;i<length;i++)
{
printf("%d",p[i]);
}
printf("\n");
printf("*********\n");
}
int main()
{
int a[5]={5,4,3,2,1};
int i,j;
int tmp;
show(a,5);
for(i=0;i<5;i++){
for(j=4;j>i;j--)
{
if(a[j]<a[j-1]){
tmp=a[j];
a[j]=a[j-1];
a[j-1]=tmp;
}
}
}
show(a,5);
return 0;
}
从上往下比较:
#include<stdio.h>
#include<stdlib.h>
void show(int *p,int length)
{
int i;
printf("*********\n");
for(i=0;i<length;i++)
{
printf("%d",p[i]);
}
printf("\n");
printf("*********\n");
}
int main()
{
int a[5]={5,4,3,2,1};
int i,j;
int tmp;
show(a,5);
for(i=0;i<5;i++){
for(j=0;j<4;j++)
{
if(a[j]>a[j+1]){
tmp=a[j];
a[j]=a[j+1];
a[j+1]=tmp;
}
}
}
show(a,5);
return 0;
}
冒泡排序的改进算法:有时已经是有序,因此我们不需要再继续进行比较,因此需要一个标记量flag来实现冒泡排序的优化
#include<stdio.h>
#include<stdlib.h>
void show(int *p,int length)
{
int i;
printf("*********\n");
for(i=0;i<length;i++)
{
printf("%d",p[i]);
}
printf("\n");
printf("*********\n");
}
int main()
{
int a[5]={5,4,3,2,1};
int i,j;
int tmp;
int flag=1;//标识符
show(a,5);
for(i=0;i<5&&flag;i++){
for(j=4;j>i;j--)
{
flag=0;//每次外圈时初始化
if(a[j]<a[j-1]){
tmp=a[j];
a[j]=a[j-1];
a[j-1]=tmp;
flag=1;//如果有交换则进行下一轮循环
}
}
}
show(a,5);
return 0;
}
至此冒泡排序已经可以结束了。。。