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)
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)
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)
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)
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]);
}
}