选择排序(具体题目+C++代码)

本文将通过举例题目和解题代码的形式具体地介绍——

选择排序

大数下沉(升序):

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 用于存储要输入的整数个数,ij 用于循环计数。
  • 通过 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) 判断),则输出空格分隔,最后输出换行符使输出规整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值