流程
- 在未排序的前n个元素中找到最大元素。
- 将其存放到第n个位置。
- 在未排序的前n-1个元素中找到最大元素。
- 将其存放到第n-1个位置。
- ……
- 以此类推,直到所有元素均排序完毕。
演示
编号 | 执行操作前的a[] | 操作 | |
---|---|---|---|
0. | 第一轮 | 9 3 5 4 1 | 默认最大元素标号为1。 |
1. | 第一轮 | 9 3 5 4 1 | 比较至第2个元素,最大的元素的标号是1。 |
2. | 第一轮 | 9 3 5 4 1 | 比较至第3个元素,最大的元素的标号是1。 |
3. | 第一轮 | 9 3 5 4 1 | 比较至第4个元素,最大的元素的标号是1。 |
4. | 第一轮 | 9 3 5 4 1 | 比较至第5个元素,最大的元素的标号是1。 |
5. | 第一轮 | 9 3 5 4 1 | 将第1个元素与第5个元素交换位置 |
6. | 第二轮 | 1 3 5 4 9 | 默认最大元素标号为1。 |
7. | 第二轮 | 1 3 5 4 9 | 比较至第2个元素,最大的元素的标号是2。 |
8. | 第二轮 | 1 3 5 4 9 | 比较至第3个元素,最大的元素的标号是3。 |
9. | 第二轮 | 1 3 5 4 9 | 比较至第4个元素,最大的元素的标号是3。 |
10. | 第二轮 | 1 3 5 4 9 | 将第3个元素与第4个元素交换位置 |
11. | 第三轮 | 1 3 4 5 9 | 默认最大元素标号为1。 |
12. | 第三轮 | 1 3 4 5 9 | 比较至第2个元素,最大的元素的标号是2。 |
13. | 第三轮 | 1 3 4 5 9 | 比较至第3个元素,最大的元素的标号是3。 |
14. | 第三轮 | 1 3 4 5 9 | 不交换。 |
15. | 第四轮 | 1 3 4 5 9 | 默认最大元素标号为1。 |
16. | 第四轮 | 1 3 4 5 9 | 比较至第2个元素,最大的元素的标号是2。 |
17. | 第四轮 | 1 3 4 5 9 | 不交换。 |
18. | 结束 | 1 3 4 5 9 |
代码
#include <stdio.h>
#define N 1001
int n,a[N];
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;++i) scanf("%d",&a[i]);
for (int i=n;i>1;i--)
{
int t,maxi=1;
for (int j=2;j<=i;++j)
if (a[maxi]<a[j]) maxi=j;
t=a[maxi],a[maxi]=a[i],a[i]=t;
}
for (int i=1;i<=n;++i) printf("%d ",a[i]);
return 0;
}
时间复杂度
双重循环,O(n^2)。