排序之冒泡排序

#include<stdio.h>  /*头文件*/

#define M 100   /*定义常量*/
int R[M];   /*定义数组*/
int main()
{
      
    int i,j,temp,n;
   
    printf("input n size:");/*数组大小*/
    scanf("%d",&n);
    
    printf("input  number  one by one:\n");
    for(i=1;i<=n;i++)/*一个一个的输入数组元素*/
    {
        scanf("%d",&R[i]);
    }
    printf("before sort numbers:\n");
    for(i=1;i<=n;i++)/*打印排序之前的数组元素*/
    {
              printf("%4d",R[i]);
    }
    printf("\n");
    for(i=1;i<=n-1;i++)/*排序趟数*/
    {
        for(j=1;j<=n-i;j++)/*每趟比较次数*/
        {
            if(R[j]>R[j+1]) /*判断前一个数据元素是否比后一个大,大于则交换*/
            {
                temp=R[j];
                R[j]=R[j+1];
                R[j+1]=temp;
            }
        }
    }
    printf(" after sort numbers:\n");
    for(i=1;i<=n;i++)  /*打印冒泡排序之后序列*/
    {
       printf("%4d",R[i]);    
    }
    
}
View Code


思想:首先是将第1个数和第2个数进行比较,若为逆序(R[1]>R[2]),则交换这两个数的位置,然后比较第2个数和第3数,以此类推,直至第n-1个数和第n个数进行比较为止.这个过程称为第一趟冒泡排序,排序结果是最大的数被排在了最后。即R[n].

    接着进行第二趟冒泡排序,即对前n-1个数再次进行两两比较,若为逆序则交换,排序结果是第二大的数被排在倒数第二。即R[n-1].然后进行第三趟冒泡排序,对前n-2个数进行同样的操作,以此类推。

     比如:10个数进行冒泡排序,必须进行9趟排序,每一趟中两个数比较次数是不相同的,第一趟比较10-1=9次(10为许排序的数目,1为该趟的趟数),第二趟要比较10-2=8次,以此类推,第i趟要比较的次数=10-i.

    如有n个数,则要进行n-1趟排序(由外循环控制),第i趟两数之间的比较要进行n-i次(由内循环控制).

 

冒泡排序速记口诀(降序):

N个数字来排序,两两相比大靠前,

外层循环N-1,内层循环N-1-i.

如果要升序,

只要把程序中的if (a[j] < a[j + 1])

小于号换成大于号就行了

 

posted @ 2013-12-31 13:22  博园少主  阅读(158)  评论(0编辑  收藏  举报