C语言:利用冒泡排序算法实现个人总分排序
设一维数组 a 有 N 个元素,要求从小到大排序。冒泡法的基本思想是:
- 第1轮比较:将相邻两个数 a[0]与 a[1]比较,若 a[0]>a[1],则两元素交换,否则不交换。 再依次 a[1]与 a[2]比较、a[2]与 a[3]比较……,只要前者比后者大就交换,直到比较到最后两个数a[N-2]与a[N-1]数。 此时,最大数已换到最后一个位置a[N-1],这算是完成了第1轮比较。共比较了N-1次。
- 第2轮比较:依次将a[0]与 a[1]比较,a[1]与 a[2]比较……,只要前者比后者大就交换,直到比较到a[N-3]与a[N-2],共比较N-2次。此时,次大数到了倒数第二位置a[N-2]。
- 这样直到第N-1轮,a[0]与a[1]比较,若 a[0]>a[1],则两元素交换,共比较1次(N-(N-1))次。此时,a[1]位置是次小的数,a[0]位置已经是最小的数。排序完成。
整个比较过程,较小的数依次“浮上”前面位置,较大的数依次“沉底”到后面位置,就像水泡上浮似的,所以称为“起泡法”或“冒泡法”。
#include <stdio.h>
#define N 5
void main()
{
int i,j,k,t,a[N];
printf("请输入%d个学生总分:\n",N);
for(i=0;i<N;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<N-1;i++) //N个数需要N-1轮排序
{
for(j=0;j<N-1-i;j++) //每轮排序中的两两比较
{
if(a[j]<a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
printf("总分从高到低排序结果为:\n");
for(i=0;i<N;i++)
{
printf("%d ",a[i]);
}
printf("\n");
}