本文将通过举例题目和解题代码的形式具体地介绍——
选择排序
大数下沉(升序):
1)第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置。
2)然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。
3)以此类推,直到全部待排序的数据元素的个数为零。
题目描述
将读入的 N 个数从小到大排序后输出。
输入格式
第一行为一个正整数 N。
第二行包含 N 个空格隔开的正整数 ai,为你需要进行排序的数。
输出格式
将给定的 N 个数从小到大输出,数之间空格隔开,行末换行且无空格。
输入输出样例
输入 #1
5 4 2 4 5 1
输出 #1
1 2 4 4 5
说明/提示
对于 20% 的数据,有 1≤N≤10^3;
对于 100% 的数据,有 1≤N≤105,1≤ai≤10^9。
#include <iostream>
using namespace std;
const int n = 100000;
int A[n] = { 0 };
int main()
{
int N, i, j;
cin >> N;
for (i = 0; i < N; i++)
cin >> A[i];
//选择排序核心逻辑
for (i = 0; i < N - 1; i++)
{
//记录当前轮的最小元素值和位置
int min_val = A[i];
int min = i;
for (j = i + 1; j < N; j++)
{
if (A[j] < min_val)
{
min_val = A[j];
min = j;
}
}
if (min != i)
{
//交换当前元素和最小元素
A[min] = A[i];
A[i] = min_val;
}
}
//排序结束
for (i = 0; i < N; i++)
{
cout << A[i]; //输出排序后的整数
if (i < N - 1) //行末换行且无空格
cout << " ";
}
cout << "\n";
return 0;
}
1.整体功能
这段 C++ 代码实现了从标准输入读取一系列整数,然后运用选择排序算法对这些整数进行排序,最后将排序好的整数序列输出到标准输出,每个整数之间用一个空格分隔的功能。
2.代码结构与细节分析
头文件与命名空间:
#include <iostream>
using namespace std;
- 引入
<iostream>
头文件以使用标准输入输出流对象cin
和cout
。 - 通过
using namespace std;
使得能直接使用std
命名空间下的相关对象,不过在大型项目中可能引发命名冲突,更建议按需使用std::
前缀明确所属命名空间。
全局数组定义:
const int n = 100000;
int A[n] = { 0 };
- 定义常量
n
为100000
来指定数组A
的大小,const
保证其在程序运行期间不可修改。 - 定义整数数组
A
并初始化为全0
。
主函数部分:
输入数据:
int N, i, j;
cin >> N;
for (i = 0; i < N; i++)
cin >> A[i];
- 声明整型变量
N
用于存储要输入的整数个数,i
、j
用于循环计数。 - 通过
cin >> N;
从标准输入读取整数确定后续输入整数序列的长度,再用循环依次读取N
个整数并存入数组A
中。
选择排序核心逻辑:
for (i = 0; i < N - 1; i++)
{
//记录当前轮的最小元素值和位置
int min_val = A[i];
int min = i;
for (j = i + 1; j < N; j++)
{
if (A[j] < min_val)
{
min_val = A[j];
min = j;
}
}
if (min!= i)
{
//交换当前元素和最小元素
A[min] = A[i];
A[i] = min_val;
}
}
- 外层循环
for (i = 0; i < N - 1; i++)
控制选择排序的轮数,共进行N - 1
轮,每轮目的是将当前未排序部分的最小元素放到正确位置。 - 每轮开始先记录当前轮未排序部分起始元素值
min_val
(即A[i]
)和位置min
(即i
)。 - 内层循环
for (j = i + 1; j < N; j++)
遍历当前未排序部分剩余元素,若发现更小元素则更新min_val
和min
。 - 内层循环结束后,若
min
不等于i
,说明找到更小元素且不在起始位置,此时通过直接赋值方式交换当前元素和最小元素,将最小元素放到当前轮起始位置。
输出排序后的结果:
for (i = 0; i < N; i++)
{
cout << A[i];
if (i < N - 1)
cout << " ";
}
cout << "\n";
- 用循环遍历已排序好的数组
A
,通过cout << A[i];
输出每个元素。 - 若当前元素不是最后一个(通过
if (i < N - 1)
判断),则输出空格分隔,最后输出换行符使输出规整。