流程
- 从第1个元素至第n-1个元素,每个元素与其下一个元素进行比较。如果当前元素比下一个元素大,就交换他们两个。
- 1过程结束后,数组中最后一个元素将会是所有数字中最大的数字,它处于合适的位置。
- 重复若干次1过程,我们就能找到数组中第2大的元素、第3大的元素、第4大的元素……直至找到第n-1大的元素。
- 数组变为有序数组。
演示
编号 | 执行操作前的a[] | 操作 | |
---|---|---|---|
0. | 第一轮 | 9 3 5 4 1 | 比较第1和第2个元素,不交换。 |
1. | 第一轮 | 3 9 5 4 1 | 比较第2和第3个元素,不交换。 |
2. | 第一轮 | 3 5 9 4 1 | 比较第3和第4个元素,交换。 |
3. | 第一轮 | 3 5 4 9 1 | 比较第4和第5个元素,不交换。 |
4. | 第二轮 | 3 5 4 1 9 | 比较第1和第2个元素,不交换。 |
5. | 第二轮 | 3 5 4 1 9 | 比较第2和第3个元素,交换。 |
6. | 第二轮 | 3 4 5 1 9 | 比较第3和第4个元素,交换。 |
7. | 第三轮 | 3 4 1 5 9 | 比较第1和第2个元素,不交换。 |
8. | 第三轮 | 3 4 1 5 9 | 比较第2和第3个元素,不交换。 |
9. | 第四轮 | 3 1 4 5 9 | 比较第1和第2个元素,不交换。 |
10. | 结束 | 1 3 4 5 9 |
代码
#include <stdio.h>
#define N 101
int n,a[N],t;
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;++i) scanf("%d",&a[i]);
for (int i=n;i>1;--i) //每一轮将a[]中第i大的元素放在合理位置上
for (int j=1;j<i;++j) // 每个元素与其下一个元素进行比较。如果当前元素比下一个元素大,就交换他们两个。
if (a[j]>a[j+1]) t=a[j],a[j]=a[j+1],a[j+1]=t;
for (int i=1;i<=n;++i) printf("%d ",a[i]);
}
时间复杂度
双重循环,O(n^2)。