小白一天学一个算法系列,从逻辑、关键、算法动画、完整示例代码四个方面进行学习。
逻辑:比较相邻两个数的大小,进行交换,大的(或者小的)放在后面,层层递进。
关键:内外两层for循环控制,外层控制循环层次,内层控制大小比较之后的元素交换。
冒泡排序动画:
完整示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 10 //数组元素个数
#define SWAP(a,b) {int tmp;tmp=a;a=b;b=tmp;} //定义宏,交换两个数,提高效率
//数组打印
void arr_print(int *arr)
{
int i;
for (i = 0; i < N; i++)
{
printf("%3d", arr[i]);
}
printf("\n");
}
//冒泡排序算法
void sort_bubble(int *arr)
{
int i,j;
for (i=N-1;i>0;i--) //外层控制循环次数,注意i=N-1这个细节,arr[N]不存在
{
for(j=0; j<N&&arr[j]>arr[j+1];j++) //内层控制大小比较和交换
{
SWAP(arr[j],arr[j+1]);
}
}
}
int main()
{
int i;
int a[N];
//srand播种time
srand((unsigned int)time(NULL));
//生成随机数并填入到数组中
for (i = 0; i < N; i++)
{
a[i]=rand()%100;
}
//调用数组打印函数,打印随机数组
arr_print(a);
//调用冒泡排序算法
sort_bubble(a);
printf("冒泡排序结果:");
arr_print(a);
printf("a[N]:%3d\n",a[N]);
system("pause");
return 0;
}