一. 原始的冒泡排序法
- 1.基本原理
从下标为0的元素开始,循环比较相邻两个元素a[j]和a[j+1]的大小,每次比较如果前面的元素a[j]都大于后面的元素a[j+1],则交换这两个元素的值。 - 2.执行过程
第一轮: 从a[0]到a[n-1],依次比较前后两个数的大小,循环n-1次后n个数据就被换到了a[n-1]的位置;
第二轮: 从a[0]到a[n-2],依次比较前后两个数的大小,循环n-2次后n个数据就被换 到了a[n-2]的位置;
依次重复以上过程n-1轮,则n个数据就从小到大排序好了!
具体代码如下所示:
//原始冒泡法
//缺点:对已经排好的数据仍要进行冒泡操作,尽管没有任何数据交换操作
#include<stdio.h>
#define N 10
int main()
{
int a[N],i,j,t;
printf("input %d numbers:\n",N);
for(i=0;i<N;i++) //输入N个数字存放入数组中
scanf("%d",&a[i]);
for(i=0;i<N-1;i++) //N个数共需进行N-1轮
for(j=0;j<N-i-1;j++) //第i轮需要比较N-i-1次
{
if(a[j]>a[j+1]) //若前面一个元素大于后面一个元素,则交换
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
for(i=0;i<N;i++) //输出排序后的数组
printf("%d ",a[i]);
return 0;
}
二. 改进后的冒泡排序法
- 1.基本原理
改进后的冒泡法和原始冒泡法的基本原理一致,不同的是改进后的冒泡排序法弥补了原始冒泡法的缺点,加入了一个标志量(flag),以此来提高程序的运行效率。
具体代码如下所示:
//冒泡法改进
//设置标志量flag
#include<stdio.h>
#define N 10
int main()
{
int a[N],i,j,t,flag; //引入标志量flag
printf("input %d numbers:\n",N);
for(i=0;i<N;i++) //输入N个数字存放入数组中
scanf("%d",&a[i]);
for(i=0;i<N-1;i++) //N个数共需进行N-1轮
{
flag=0; //flag开始赋值为0
for(j=0;j<N-i-1;j++) //第i轮需要比较N-i-1次
{
if(a[j]>a[j+1]) //若前面一个元素大于后面一个元素,则交换
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
flag=1; //若进行了数据交换,则flag赋值为1
}
}
if(flag==0) break; //如果没有进行数据交换,则结束排序
}
for(i=0;i<N;i++) //输出排序后的数组
printf("%d ",a[i]);
return 0;
}