冒泡法排序笔记

版权声明:原创,还是不要转载了吧,如果忍不住要转载,就一定要注明地址哦! https://blog.csdn.net/Reborn_Lee/article/details/82082223

和上篇博文:简单的成绩录入系统程序及分析以及思考一样,这篇也是一年前做的笔记,真恨自己当时为什么就不知道使用博客记笔记,有了博客,就可以看到自己学习的点滴和进步,记笔记也方便,还能分享知识。


本文档致力于练习冒泡排序法,用c语言的各种语法,例如数组,指针等知识进行编程,达到既对算法的一次实践,又对语法的一次回顾,争取熟悉c编程语言,不断应用c语言,实现最后的推陈出新。

冒泡排序法是一种重要的排序思想,本次练习要实现玩转冒泡排序法,同样,本程序中的排序算法均在一个定义的函数中实现,不断改变的是数组与指针的用法,但指针仅限于列指针。下面是第一个源程序:

  1.  

#include<stdio.h>

int main()

{

      void bubble(int *p,int n);    //冒泡排序法函数声明

      int array[10],i;

      printf("Please input 10 interger numble:\n");

      for(i=0;i<=9;i++)

           scanf("%d",&array[i]);        //输入十个整数

      bubble(array,10);             //冒泡排序函数调用

      printf("The order of the numble concerned is:\n");

      for(i=0;i<=9;i++)             //输出排序后的数

           printf("%d ",array[i]);

      printf("\n");

      return 0;

}

void bubble(int *p,int n)        //冒泡排序函数定义

{

      int i,j,temp;

      for(i=0;i<=n-2;i++)

           for(j=0;j<n-1-i;j++)     //每次沉下去一个最大的数,小循环的次数就少一次

                 if(p[j]>p[j+1])

                 {

                      temp=p[j];

                      p[j]=p[j+1];

                      p[j+1]=temp;

                 }

}

注意,bubble函数中的指针p,使用时用了p[]形式,这样做是为了与数组类似,便于理解。下面将其改成等效形式:

void bubble(int *p,int n)        //冒泡排序函数定义

{

      int i,j,temp;

      for(i=0;i<=n-2;i++)

           for(j=0;j<n-1-i;j++)     //每次沉下去一个最大的数,小循环的次数就少一次

                 if(*(p+j)>*(p+j+1))

                 {

                      temp=*(p+j);

                      *(p+j)=*(p+j+1);

                      *(p+j+1)=temp;

                 }

}

  1. 主函数中使用数组,定义函数bubble的形参使用指针时一种常用的形式,使用指针进行编程是c语言的精髓,是一种高效的形式。

下面的源程序对上述程序进行改进,将主函数中的数组也用指针进行处理:

#include<stdio.h>

int main()

{

  void bubble(int *p,int n);    //冒泡排序法函数声明

  int array[10],i;

  int *pp=array,*pp_end=pp+9;

  printf("Please input 10 interger numble:\n");

  for(;pp<=pp_end;pp++)

        scanf("%d",pp);        //输入十个整数

  pp=array;

  bubble(pp,10);             //冒泡排序函数调用

  printf("The order of the numble concerned is:\n");

  pp=array;

  for(;pp<=pp_end;pp++)             //输出排序后的数

        printf("%d ",*pp);

  printf("\n");

  return 0;

}

void bubble(int *p,int n)        //冒泡排序函数定义

{

  int i,j,temp;

  for(i=0;i<=n-2;i++)

        for(j=0;j<n-1-i;j++)     //每次沉下去一个最大的数,小循环的次数就少一次

              if(*(p+j)>*(p+j+1))

              {

                   temp=*(p+j);

                   *(p+j)=*(p+j+1);

                   *(p+j+1)=temp;

              }

}

最后,介绍下冒泡程序的编程思想:

冒泡排序的思想就是依次对两个顺序的数进行比较,小的浮上来,大的沉下去。假如对N个数进行冒泡法排序,首先将N个数放入数组当中array[N],让后进行N-1次大的循环,即for(i=0;i<N-1;i++)

接着,在大循环(i=0)下进行小循环,例如第一次循环是array[0]与array[1]比较,如果array[0]大,则交换顺序,然后array[1]与array[2]比较,大的沉下去,一直到array[N-2]与array[N-1]比较,大的沉下去,总共比较了N-1-0次,经历这次比较,最大的数沉到了最下面。

之后,用同样的方法对array[0]到array[N-2]进行比较,次大的数沉到了array[N-2]的地址中,总共经历了N-1-1次比较。

当i=N-2时候,需要比较的是array[0]与array[1]即array[N-1-(N-2)],大的沉入array[1]中,则array[0]中为最小的数,这样就实现了冒泡排序。

总之,小循环的次数为N-1-i。

 

猜你喜欢

转载自blog.csdn.net/Reborn_Lee/article/details/82082223
今日推荐