vlambda博客
学习文章列表

C语言——如何有效记忆冒泡排序法?

冒泡排序法在C语言课程中是一个很重要的算法。要熟练掌握冒泡排序法,首先要有深刻的理解,同时也要准确地记住这个算法对应的代码,这样才能快速、准确地运用冒泡排序法写代码解决问题。那怎样有效地记忆住冒泡排序法对应的代码呢?下面跟大家分享一下我总结的口诀。

原创不易,欢迎点赞分享。

首先要对循环次数有深刻的理解,下面是几种情况:

1、for(i=0 ; i<k ; i++)

循环了 k 次,因为最后一次循环对应的 i 值为 k-1,而 0~k-1 有 k 个数,一个数对应一次循环,所以循环了 k 次。


2、for(i=0 ; i<=k ; i++)

循环了 k+1 次,因为最后一次循环对应的 i 值为 k,而 0~k 有 k+1 个数,一个数对应一次循环,所以循环了 k+1 次。


3、、for(i=1 ; i<k ; i++)

循环了 k-1 次,因为最后一次循环对应的 i 值为 k-1,而 1~k-1 有 k-1 个数,一个数对应一次循环,所以循环了 k-1 次。


4、for(i=1 ; i<=k ; i++)

循环了 k 次,因为最后一次循环对应的 i 值为 k,而 1~k 有 k 个数,一个数对应一次循环,所以循环了 k 次。


口诀:

两重循环,//有两个for 循环

两个变量,//有两个循环控制变量 i,j;其中j 既是循环控制变量,又

一重循环 NUM-1 次,//NUM 为数组的元素数目。

二重循环 ( NUM-第几次一重循环 )   次,

//说明:为什么不说 NUM-i 次呢?因为 i 的初始值为1时才是 NUM-i 次,i 的初始值为0 时就是 NUM-i-1 次了。

一重循环体放二重循环,

二重循环体放大小比较与交换。

交换内容要看 j 初值。

//说明:j 的 初值为 1时 应交换 a[j-1] 与 a[j] , j 的 值为0时交换 a[j] 与 a[j+1].总之要从第一个数  a[0]  开始比较、交换。

所以冒泡排序法有以下 2*2=4 种写法。各种写法的区别是 i 和 j的初值不同。

写法一:(i=0 , j=0)

#include<stdio.h>#define NUM 10
int main(){ int a[NUM]={2,8,46,92,37,28,56,1,65,93}; int i,j,k; int temp; for(i=0;i<NUM-1;i++) { for(j=0;j<NUM-(i+1);j++) { if(a[j]>a[j+1]) { temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; } } } for(k=0;k<NUM;k++) { printf("第 %d 个数:%d \n",k+1,a[k]); }}

写法二:(i=1 , j=0)

#include<stdio.h>#define NUM 10
int main(){ int a[NUM]={2,8,46,92,37,28,56,1,65,93}; int i,j,k; int temp; for(i=1;i<=NUM-1;i++) { for(j=0;j<NUM-i;j++) { if(a[j]>a[j+1]) { temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; } } } for(k=0;k<NUM;k++) { printf("第 %d 个数:%d \n",k+1,a[k]); }}

写法三:(i=0 , j=1)

#include<stdio.h>#define NUM 10
int main(){ int a[NUM]={2,8,46,92,37,28,56,1,65,93}; int i,j,k; int temp; for(i=0;i<NUM-1;i++) { for(j=1;j<=NUM-(i+1);j++) { if(a[j-1]>a[j]) { temp=a[j-1]; //注意此时这里也变了。 a[j-1]=a[j]; a[j]=temp; } } } for(k=0;k<NUM;k++) { printf("第 %d 个数:%d \n",k+1,a[k]); }}

写法四:(i=1 , j=1)

#include<stdio.h>#define NUM 10
int main(){ int a[NUM]={2,8,46,92,37,28,56,1,65,93}; int i,j,k; int temp; for(i=1;i<=NUM-1;i++) { for(j=1;j<=NUM-i;j++) { if(a[j-1]>a[j]) { temp=a[j-1]; a[j-1]=a[j]; a[j]=temp; } } } for(k=0;k<NUM;k++) { printf("第 %d 个数:%d \n",k+1,a[k]); }}