c语言数组中冒泡排序基础
本文章对数组中冒泡排序基础思想进行分析、讲解,适合初学者对冒泡排序算法的了解。
冒泡排序核心思想
相邻的两个数进行比较,如果前面的数比后面的大,就交换
逐步分析
假设有这样的一个数组
int a[5]={5,3,2,1,4};
我们可以想到每次排序的大致样子是这样:
5 3 2 1 4 一次冒泡后:将一个最大值放到数组最后
3 2 1 4 5 重复执行5次
3 2 1 4 5
2 1 3 4 5
1 2 3 4 5
首先,我们先记住这个核心思想(相邻交换),得出以下代码
if(a[i]>a[i+1])
{
temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;
}
而我们并不是只交换一次,要边遍历数组,边进行交换,得出以下代码
for(i=0;i+1<5;i++)//i+1<5是为了保证我们操作的元素不越界
{
if(a[i]>a[i+1])
{
temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;
}
}
通过一次遍历数组我们只能将一个最大值进行排序,所以我们还要进行5次相同的操作
for(j=0,j<5,j++)
{
for(i=0;i+1<5;i++)
{
if(a[i]>a[i+1])
{
temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;
}
}
}
由以上分析我们可以看出外层循环其实是和内层没有关系的,当然,网上很多其他案例都是经过优化的,比我的算法好得多,我得初心,是为了让初学者更明白其中的原理。也想与大家交流讨论思想
以上代码总结案例:
对数组a进行冒泡排序
#include<stdio.h>
int main(void)
{
int a[5]={5,3,2,1,4};
int i,j;//循环控制变量
int temp;//交换使用到的交换变量
for(j=0,j<5,j++)//循环5次
{
for(i=0;i+1<5;i++)//遍历数组
{
if(a[i]>a[i+1])//冒泡操作
{
temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;
}
}
}
//打印数组
for(i=0;i<5;i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}
实例:
取20个100以内随机数,将20个随机数存入a数组中,再对其进行冒泡排序
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main(void)
{
int a[20];
int i,j,temp;
srand(getpid());
//赋值
for(i=0;i<20;i++)
a[i]=rand()%100;
//冒泡操作
for(j=0,j<20,j++)//外层循环
{
for(i=0;i+1<20;i++)//遍历数组
{
if(a[i]>a[i+1])//冒泡操作
{
temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;
}
}
}
//打印数组
for(i=0;i<20;i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}
经过编译后,运行结果如下: