编写程序实现冒泡排序。
首先我们要了解冒泡法排序的算法思想:
对所有相邻记录的关键字值进行比较,如果是逆序则将其交换,最终达到有序化,其处理过程为:
- 将整个待排序的记录序列划分成有序区和无序区,初始状态有序区为空,无序区包括所有待排序的记录。
- 对无序区从前向后依次将相邻记录的关键字进行比较,若逆序将其交换,从而使得关键字值小的记录向上“飘浮”(左移),关键字值大的记录好像石块,向下“堕落”(右移)。 每经过一趟冒泡排序,都使无序区中关键字值最大的记录进入有序区,对于由
n
个记录组成的记录序列,最多经过n-1
趟冒泡排序,就可以将这n
个记录重新按关键字顺序排列。
以长度为n=10
的序列(8 7 6 5 9 3 4 0 2 1)
的冒泡排序过程做示范: 第一趟:在经过9
次对所有相邻数据进行比较后,则数组中元素为(7 6 5 8 3 4 0 2 1 9)
; 第二趟:在经过8
次对所有相邻数据进行比较后,则数组中元素为(6 5 7 3 4 0 2 1 8 9)
; 第三趟:在经过7
次对所有相邻数据进行比较后,则数组中元素为(5 6 3 4 0 2 1 7 8 9)
; ……以此类推,共执行9
趟操作,可将有n=10
个元素的数组排成有序序列(0 1 2 3 4 5 6 7 8 9)
。
翻译一下:
给出一个数组:a[10]={29 62 73 90 93 46 43 38 76 52}
第一次循环从i=0开始将a[i]和a[i+1]比较,如果a[i]>a[i+1],则将二者互换。直到最大元素“沉底”(a[9]=93)。之后重复这个过程,使数组实现有序排序。
以下为编写展示:
测试输入:
10
29 62 73 90 93 46 43 38 76 52
输入说明: 第一行为
n
,表示n
个整数。 第二行为n
个整数(下面运行结果中前两行同)。
预期输出:
29 62 73 90 46 43 38 76 52 93
29 62 73 46 43 38 76 52 90 93
29 62 46 43 38 73 52 76 90 93
29 46 43 38 62 52 73 76 90 93
29 43 38 46 52 62 73 76 90 93
29 38 43 46 52 62 73 76 90 93
29 38 43 46 52 62 73 76 90 93
29 38 43 46 52 62 73 76 90 93
29 38 43 46 52 62 73 76 90 93
#include <stdio.h>
#define N 100
int main ()
{
int a[N],n,i,j,t;
scanf ("%d",&n);
for (i=0;i<n;i++)
scanf ("%d",&a[i]);
for (i=0;i<n-1;i++)
{
for (j=0;j<n-1;j++)
{
if (a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
for (j=0;j<n;j++)
printf ("%d ",a[j]);
printf ("\n");
}
return 0;
}
运行结果:
运行成功!