冒泡排序算法的运作如下:(从后往前)
1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
3.针对所有的元素重复以上的步骤,除了最后一个。
4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
由于在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序。
用二重循环实现,外循环变量设为i,内循环变量设为j。假如有10个数需要进行排序,则外循环重复9次,内循环依次重复9,8,…,1次。每次进行比较的两个元素都是与内循环j有关的,它们可以分别用a[j]和a[j+1]标识,i的值依次为1,2,…,9,对于每一个i,j的值依次为1,2,…10-i。
测试代码如下:
#include <stdio.h>
#define N 10
int main()
{
static int a[N] ;
int i,j,t;
for(i=0;i<N;i++)
{
scanf("%d",&a[i]);
}
printf("\n");
for(i=0;i<N;i++)
{
printf("%-4d",a[i]);
}
printf("\n");
for(i=0;i<N-1;i++) // 需要排序的次数,有N个数,需要排序N-1次
{
for(j=0;j<N-1-i;j++) // 每一次排序需要比较的次数 N个数需要比较N-1次
{
if(a[j] > a[j+1])
{
t = a[j] ;
a[j] = a[j+1];
a[j+1] = t;
}
}
}
printf("冒泡排序(从小到大):");
for(i=0;i<N;i++)
{
printf("%-4d",a[i]);
}
printf("\n");
for(i=0;i<N-1;i++) // 需要排序的次数,有N个数,需要排序N-1次
{
for(j=0;j<N-1-i;j++) // 每一次排序需要比较的次数 N个数需要比较N-1次
{
if(a[j] < a[j+1])
{
t = a[j] ;
a[j] = a[j+1];
a[j+1] = t;
}
}
}
printf("冒泡排序(从大到小):");
for(i=0;i<N;i++)
{
printf("%-4d",a[i]);
}
printf("\n");
return 0;
}
这个是普通版本的冒泡排序,然后下来使用C语言指针做的冒泡排序,实验代码如下:
#include <stdio.h>
#define N 10
int main()
{
static int a[N] ;
int *p = a;
int i,j,t;
for(i=0;i<N;i++)
{
scanf("%d",p+i);
}
printf("\n");
for(i=0;i<N;i++)
{
printf("%-4d",*(a+i));
}
printf("\n");
for(i=0;i<N-1;i++) // 需要排序的次数,有N个数,需要排序N-1次
{
for(j=0;j<N-1-i;j++) // 每一次排序需要比较的次数 N个数需要比较N-1次
{
if(*(p+j) > *(p+j+1))
{
t = p[j] ;
p[j] = p[j+1];
p[j+1] = t;
}
}
}
printf("冒泡排序(从小到大):");
for(i=0;i<N;i++)
{
printf("%-4d",p[i]);
}
printf("\n");
for(i=0;i<N-1;i++) // 需要排序的次数,有N个数,需要排序N-1次
{
for(j=0;j<N-1-i;j++) // 每一次排序需要比较的次数 N个数需要比较N-1次
{
if(a[j] < a[j+1])
{
t = a[j] ;
a[j] = a[j+1];
a[j+1] = t;
}
}
}
printf("冒泡排序(从大到小):");
for(i=0;i<N;i++)
{
printf("%-4d",a[i]);
}
printf("\n");
return 0;
}
最后还有一版优化的冒泡选择排序:
#include <stdio.h>
#define N 10
int main()
{
static int a[N] ;
int i,j,t,min;
for(i=0;i<N;i++)
{
scanf("%d",&a[i]);
}
printf("\n");
for(i=0;i<N;i++)
{
printf("%-4d",a[i]);
}
printf("\n");
for(i=0;i<N-1;i++) // 排序的次数, N个数需要N-1次排序
{
// min = i ;
for(j=0,min=0;j<N-1-i;j++) //每一次排序需要比较的次数, N个数需要比较N-1次
{
if(a[min] > a[j+1] )
{
min = j+1;
}
}
t = a[N-1-i] ;
a[N-1-i] = a[min] ;
a[min] = t;
}
printf("选择排序优化版:");
for(i=0;i<N;i++)
{
printf("%-4d",a[i]);
}
printf("\n");
return 0;
}
大家要在实际应用中具体使用,需要灵活应用。
------领卓教育