冒泡法排序

2012-04-05  金城  36638

//冒泡法排序
#include<stdio.h>
void main()
{
int a[10];  //定义一个数组既它的元素为10
int i,j,temp;    //定义3个变量
printf("输入10个整数:\n\a");
for(i=0;i<10;i++)
  scanf("%d",&a[i]);//依次输入10个整数
for(i=0;i<9;i++)     //进行9轮排序
{
  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("排序结果:");
for(i=0;i<10;i++)  //依次输出排序结果
  printf("%d\t ",a[i]);
}
随便输入几个数,然后按从小到大或者是从大到小的顺序排列

输入五个数,按从小到大的顺序排列



//从小到大排列
#include<stdio.h>
void main()
{
int i,j,a[5],temp;
for(i=0;i<5;i++)
{
 printf("please input a number a[%d]=",i);
    scanf("%d",&a);
}
for(i=4;i>0;i--)
{
 for(j=4;j>4-i;j--)
 {
if(a[j-1]>a[j])
   {
temp=a[j-1];
    a[j-1]=a[j];
    a[j]=temp;
   }
 }
}
 for(i=0;i<5;i++)
  printf("%d\t",a);
}

从大到下就是将语句"if(a[j-1]>a[j])"改为"if(a[j-i]<a[j])"即可

程序分析

冒泡法顾名思义就是将一个数从下面浮上来,假设有5个数,21 56 87 6 9,

将第五个元素的值与第四个元素的值相比,如果第五个元素的值小于第四个元素的值,则交换着两个元素的值。
接下来,将第四个元素的值与第三个元素的值进行比较,按照类似的方式,如果发现下面元素的值小于上面元素的值,则交换着两个值。
将第三个元素的值与第二个元素的值比较,做同样的工作。
在这一轮比较结束时,最小值将到达最上面,可以说最小值已经浮到最上面
第二轮,从最底部的元素开始比较,直到第二个元素,因为第一个已经是最小,不需要再进行比较。
其实,就是一个for循环,最外面的循环控制循环的次数,需要有n-1次循环

固定为for(i=n-1;i>0;i--)

里面的循环从最大值开始,次数为n-1-i,

固定为for(j=n-1;j>n-1-i;j--)

循环体就是

if(a[j-1]>a[j])

{temp=a[j-1];

a[j-1]=a[j];

a[j]=temp;

}

直接套用即可


字符串的比较也是一样,这里不再罗嗦
例:将dcaeb 按字母顺序排列
#include <stdio.h>
#include <string.h>
#define  N  6
void  string_cmp(char  *p)
{
 int  i,j;
 char  o;
 for(i=0;i <N-1;i++)
 {
   for(j=i+1;j <N-1;j++)
   {
     //if(*(p+i)>*(p+j))
 if(strcmp((p+i),(p+j))>0)
       {
           o=*(p+i);
           *(p+i)=*(p+j);
           *(p+j)=o;
       }  
   }
 }
}
main()
{
   int  i;
   char  a[N]= "dcaeb ";
   string_cmp(a);
   for(i=0;i <(N-1);i++)
   printf( "%c ",a);
   printf( "\n ");  
   getch();
}