排序思路:从数组的第一个开始,首先a[0]和a[1]比较大小,将两者中大的往后放,然后是a[1]和a[2]进行比较,也是将两者中大的往后放,一轮下来,最大的就被放在了最后面,此为一轮。然后重复如上操作,但经第一轮后,最后一个已经确定了,可以不用管了,然后经过一轮比较都可以确定一个,如此往复,直至比较完成。
完整程序如下:
#include<stdio.h>
#define N 10 //此处可以自定义N,按需求改变数组的大小
int main()
{
int a[N]={0};
int i,j,temp=0;
printf("请输入要比较的值:");
for(i=0;i<N;i++) //遍历数组给入值
{
scanf("%d",&a[i]);
}
for(i=0;i<N-1;i++) //冒泡法开始
{
for(j=0;j<N-1-i;j++)
{
if(a[j]>a[j+1])
{
temp=a[j+1]; //常规的比较交换,用到一个中间变量,存值
a[j+1]=a[j];
a[j]=temp;
}
}
}
for(i=0;i<N;i++) //遍历数组输出
{
printf("%d\n",a[i]);
}
return 0;
}
此处还将冒泡排序算法封装了一下,传入一个待排序的数组和数组长度就可以实现排序
//从小到大的排序
void bubbleSort(int array[],int size)
{
int i,j,temp;
for(i = 0;i < size - 1;i++)
{
for(j = 0 ; j < size - i -1; j++)
{
if(array[j] > array[j+1])
{
temp = array[j+1];
array[j+1] = array[j];
array[j] = temp;
}
}
}
}
从封装好的程序上看,冒泡排序的实现共用到两重循环。
第一重循环,表示要执行的趟数,假设有N个数,每一趟都需要经历从前往后的两两比较,每一趟都确定下一个数的位置来,但当最后只剩下一个数的时候其实已经不用再比较了,其他的都定了,那他也就定了,所以外层循环设置的条件是N-1趟。
第二重循环,表示每一趟中,要从前往后两两比较的次数,可以这样看
假设是10个数
第一趟,两两比较的次数就是9
第二趟,因为前一趟已经定下一个数来了,所以你可以认为总数是9,所以,两两比较的次数就是8
。。。。。。
由此,不难发现其中的规律,每多一趟,可以理解成总数少1,也就是 N - i,其次比较次数总是比数的总量少1,因此循环条件是 j < N - i -1也不难理解