今天来分享一个冒泡法,也是很常见的一种C语言算法。
首先我们先来看代码
题目前提:输入10个数,将10个数升序(从小到大)或降序(从大到小)排列
在这里是升序。
#include<stdio.h>
#define M 10
void Bub_sort1(int a[], int k) //输入冒泡法的一个函数
{
int j,t,i; //定义j、t、i
for (j = 0; j < k - 1; j++)
for (i = 0; i < k - 1 - j; i++)
{
if (a[i] > a[i + 1])
{
t = a[i];
a[i] = a[i + 1];
a[i + 1] = t;
}
}
}
void main()
{
int a[M], i;
for (i = 0; i < M; i++)
scanf("%d", &a[i]);
Bub_sort1(a, M);
for (i = 0; i < M; i++)
printf("%6d", a[i]);
}
例如下列这个图(这里是6个数的)
那第二轮第三轮也就是按照第一轮这样换,通过前后两个数的比较进行交换,最后将会变成这样
好,看完我们的大概,现在来看我们主要算法的运行和写法。
void Bub_sort1(int a[], int k)
{
int j,t,i; //定义j、t、i
for (j = 0; j < k - 1; j++) //第一个外循环控制轮数,一共10个数,则要进行10-1轮
for (i = 0; i < k - 1 - j; i++) //第二个内循环控制交换次数
{
if (a[i] > a[i + 1]) //交换的条件
{
t = a[i]; //前面所讲的替换算法
a[i] = a[i + 1];
a[i + 1] = t;
}
}
}
外循环j:控制轮数10个数,循环10-1轮
j=0;j<10-1;j++;
内循环i:控制交换次数
j=0,交换9次,i<9; j=1,交换8次,i<8; j=2,交换7次,i<7; j=3,交换6次,i<6;
j=4,交换5次,i<5;j=5,交换4次,i<4;j=6,交换3次,i<3;j=7,交换2次,i<2;
j=8,交换1次,i<1
在这个规律中发现 j<k-1,i<k-j-1(重点)‘
这个就是我们冒泡排序法的重点内容了!
讲完这个冒泡排序,我们还有一个引申内容,,就是值传递与地址传递。
值传递:形参是普通变量,实参是普通变量或者数组元素值。可以通过return带回一个返回值;可以通过全局变量带回多个值。
地址传递:将数组a区域的首地址传给形参,形参数组与实参数组a共享同一个存储区域。
地址传递带回多值的原因: 形参与实参共享空间。
在我们刚刚的函数中的形参改成是指针变量,那是不是就实现了呢?
void Bub_sort2(int *p,int m)
{
int i,j,t;
for(j=0;j<m-1;j++)
for(i=0;i<m-1-j;i++)
if(*(p+i)>*(p+i+1))
{
t=*(p+i);
*(p+i)=*(p+i+1);
*(p+i+1)=t;}
}
将这个与我们上面的代码作比较是不是将所有为数组的地方改成了指针。这样就实现了地址传递。
我们可以按照上面这个去尝试我们的代码是否能运行!
好了,这就是今天的所有内容,多多重复,百炼成钢!!!