#include <stdio.h>
#define MAXN 10
int main()
{
int i, index, k, n, temp;
int a[MAXN];
scanf("%d", &n);
for (i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
// 外层循环控制排序轮数,一共需要n-1轮
for (k = 0; k < n - 1; k++)
{
// 先假设当前未排序部分的第一个元素(即a[k])为最大元素的下标
index = k;
// 内层循环用于在未排序部分寻找最大元素的下标
for (i = k + 1; i < n; i++)
{
if (a[i] > a[index])
{
index = i;
}
}
// 交换找到的最大元素和当前轮次开始位置的元素
temp = a[index];
a[index] = a[k];
a[k] = temp;
}
for (i = 0; i < n; i++)
{
printf("%d ", a[i]);
}
return 0;
}
以下是代码分析:
整体思路
选择排序的基本思想是每一轮从待排序的数据元素中选出最大(或最小)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最大(或最小)元素,然后放到已排序序列的末尾,以此类推,直到全部待排序的数据元素排完。
代码各部分说明
1. 变量定义部分:
- 定义了 i 、 index 、 k 、 n 、 temp 等整型变量, i 通常用于循环计数, index 用于记录每一轮找到的最大元素的下标, k 用于控制外层循环(表示排序的轮次), n 用于存储输入整数的个数, temp 用于交换元素时的临时存储。
- 定义了数组 a ,用于存放输入的整数,其最大长度由 MAXN 定义为10。
2. 输入部分:
- 通过 scanf 函数先获取输入整数的个数 n ,然后使用 for 循环逐个读入 n 个整数并存入数组 a 中。
3. 排序部分(核心逻辑):
- 外层 for 循环:
- 循环条件是 k < n - 1 ,因为一共进行 n - 1 轮排序就能将 n 个元素排好序(最后一个元素会自然处于正确位置)。每一轮循环开始时,先默认当前未排序部分的第一个元素(也就是 a[k] 所在位置的元素)是最大元素,所以将 index 初始化为 k 。
- 内层 for 循环:
- 从 k + 1 位置开始(因为已经默认 a[k] 是最大元素候选了,所以从它后面的元素开始找更大的)到 n 遍历未排序的部分,用 if 语句比较 a[i] 和当前记录的最大元素 a[index] ,如果 a[i] 更大,就更新 index 为 i ,这样内层循环结束后, index 就指向了这一轮未排序部分中的最大元素下标。
- 交换元素:
- 找到每一轮的最大元素下标 index 后,使用 temp 作为临时变量,将 a[index] (最大元素)和 a[k] (当前轮次开始位置的元素)进行交换,使得每一轮都把未排序部分的最大元素放到已排序部分的末尾(从大到小排序)。
4. 输出部分:
- 最后使用 for 循环遍历整个排好序的数组 a ,通过 printf 函数将每个元素输出,元素之间用空格隔开。
这样,整个程序就能实现对输入的 n 个整数进行从大到小的选择排序并输出排序后的结果了,当然要注意输入时要按照程序要求正确输入整数的个数以及相应个数的整数哦。