冒泡排序的原理是把一个数固定到合理的位置,他的前边都是比他小的,后边都是比他大的(或者恰恰相反),这样就能一个一个的固定每个数的位置,实现有序。
从0开始的冒泡排序,原始版,初学版
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a,b,i,c,n,j,t;
scanf("%d",&n);
int sum[n];
for(i=0; i<=n-1; i++)
{
scanf("%d %d %d",&a,&b,&c);
sum[i]=a+b+c;
}
for(i=0; i<=n-2; i++) //需要比较除它之外的值,所以i<=n-1-1,第二个1为它本身
{
for(j=0; j<=n-2-i; j++) //比较除他本身和已比较的i之外的所有值
{
if(sum[j]<sum[j+1])
//如果sum(j+1)>sum(j),把sum(j+1)的值和sum(j)的值交换,即把大数放到前面
//sum[j]<sum[j+1]格式不能倒置,不能写成sum[j+1]<sum[j],但可以写成sum[j]>sum[j+1]
{
t=sum[j];
sum[j]=sum[j+1];
sum[j+1]=t;
}
}
}
for(i=0; i<=n-1; i++)
{
printf("%d\n",sum[i]);
}
return 0;
}
从1开始的冒泡循环(以SDUT1569-选夫婿1为例)
#include <stdio.h>
#include <stdlib.h>
struct yyh
{
char a[25];
int b;
int c;
} a[100000],t;
int main()
{
int i,n,j,e,f,c,d;
scanf("%d",&n);
for(i=1; i<=n; i++)
{
scanf("%s %d %d",a[i].a,&a[i].b,&a[i].c);
}
scanf("%d %d %d %d",&e,&f,&c,&d);
int flag=0;
for(i=1; i<=n-1; i++) //记好冒泡排序从1开始是<=n-1和下面的<=n-i;从0开始是<=n-2和<=n-2-i;
{
for(j=1; j<=n-i; j++)
{
if(a[j].b>a[j+1].b)
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
if(a[j].b==a[j+1].b)
{
if(a[j].c>a[j+1].c)
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
}
for(i=1; i<=n; i++)
{
if(e<=a[i].b&&a[i].b<=f&&c<=a[i].c&&a[i].c<=d)
{
printf("%s %d %d\n",a[i].a,a[i].b,a[i].c);
flag=1;
}
}
if(flag==0)
{
printf("No\n");
}
return 0;
}
改进版冒泡循环(以SDUT1196-排序问题为例)
package First;
import java.util.*;
public class Main
{
public static void main(String[] args)
{ int[] a=new int[15];
int[] b=new int[15];
Scanner in=new Scanner(System.in);
for(int i=1;i<=10;i++)
{
a[i]=in.nextInt();
b[i]=i;
}
change(a,b);
for(int i=1;i<=10;i++)
{
if(i!=10) System.out.printf("%d ",a[i]);
else System.out.printf("%d\n",a[i]);
}
for(int i=1;i<=10;i++)
{
if(i!=10) System.out.printf("%d ",b[i]);
else System.out.printf("%d\n",b[i]);
}
}
public static void change(int[] a,int[] b)
{
int t;
boolean sorted=true;
for(int i=1;i<=9&&sorted;i++)
{
sorted=false;
for(int j=1;j<=10-i;j++)
{
if(a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
t=b[j];
b[j]=b[j+1];
b[j+1]=t;
sorted=true;
}
}
}
}
}