冒泡法排序笔记

举报
李锐博恩 发表于 2021/07/16 00:04:30 2021/07/16
【摘要】 和上篇博文:简单的成绩录入系统程序及分析以及思考一样,这篇也是一年前做的笔记,真恨自己当时为什么就不知道使用博客记笔记,有了博客,就可以看到自己学习的点滴和进步,记笔记也方便,还能分享知识。 本文档致力于练习冒泡排序法,用c语言的各种语法,例如数组,指针等知识进行编程,达到既对算法的一次实践,又对语法的一次回顾,争取熟悉c编程语言,不断应用c语言,实现最后的推陈出新。 ...

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


本文档致力于练习冒泡排序法,用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。

 

文章来源: reborn.blog.csdn.net,作者:李锐博恩,版权归原作者所有,如需转载,请联系作者。

原文链接:reborn.blog.csdn.net/article/details/82082223

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。