问题分析:对于一个一维数组a[n],共有a[0],a[1],a[2],......,a[n-1]共计n个元素,首先,我们将a[0]和a[1]进行比较,如果a[0]>a[1],那就将二者存放的数值进行交换,同理,再比较a[1]a[2],a[2],a[3]......直到a[n-2]和a[n-1]。因此第一轮一共进行了n-1次比较,比较过后a[n-1]中一定存放的是最大的数。
因此,只需要将剩下的n-1个数进行大小排序,步骤与刚才的完全一致。
总结以上的分析可知,共比较n-1轮,第i轮比较n-i次,因此我们用两层循环来解决该问题。
第一层循环控制轮数,第二层循环控制每层比较的次数。
核心步骤为
for(int i=1;i<n;i++)//控制轮数
for(int j=1;j<=n-i;j++)//控制每轮比较的次数
if(a[j]<a[j-1]){t=a[j];a[j]=a[j-1];a[j-1]=t; }//如果后一个比前一个大,则交换它们的数值。
程序实例
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
//数组从小到大排序
//第一个数n为这个数组中元素的个数
int n,num,t;
while(scanf("%d",&n)!=EOF)
{
int a[n];
for(int i=0;i<n;i++)
{scanf("%d",&num);
a[i]=num;//输入
}
for(int i=1;i<n;i++)
for(int j=1;j<=n-i;j++)
if(a[j]<a[j-1]){t=a[j];a[j]=a[j-1];a[j-1]=t; }//冒泡排序
for(int i=0;i<n;i++)
printf("%d",a[i]);//输出
}
return 0;
}