蓝桥杯 选择排序

选择排序的思想

选择排序的思想和冒泡排序类似,是每次找出最大的然后直接放到右边对应位置,然后将最

右边这个确定下来(而不是一个一个地交换过去)。

再来确定第二大的,再确定第三大的...

对于数组a[],具体的来说,每次确定操作(假设当前要确定的是i位置)就是从左往右扫描,

计算出最大元素的下标max_id, 最后执行一次swap(a[max_id],a[i])将两项交换即可。

第一次确定操作是将a[1]~a[n]中最大的放到a[n];

第二你确定操作是将a[1]~a[n-1]中最大的放到a[n-1]。

类推(类似地,如果你想先把最小的放到左边也是可以的),时间复杂度为O(n^2)。

选择排序的实现

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+9;
int a[N];
int main(){
	int n;cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	
	//i表示当前要确定的位置 
	for(int i=n;i>=1;i--){
		int max_id=1;//初始化为1
		//j从左往右扫求出max_id
		for(int j=1;j<=i;j++){
			if(a[j]>a[max_id])max_id=j;
		} 
		swap(a[max_id],a[i]);
	}
	
	//输出
	for(int i=1;i<=n;i++) cout<<a[i]<<" \n"[i==n];
	return 0; 
}

例题讲解

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+9;
int a[N];
int main(){
	int n;cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	for(int i=n;i>=1;i--){
		int max_id=1;
		for(int j=1;j<=i;j++){
			if(a[j]>a[max_id])max_id=j;
		} 
		swap(a[max_id],a[i]);
	}
	for(int i=1;i<=n;i++) cout<<a[i]<<" \n"[i==n];
	return 0; 
}
相关推荐
风吹乱了我的头发~39 分钟前
Day52:2026年3月20日打卡
算法
AI+程序员在路上5 小时前
CANopen 协议:介绍、调试命令与应用
linux·c语言·开发语言·网络
2401_831824965 小时前
基于C++的区块链实现
开发语言·c++·算法
We་ct5 小时前
LeetCode 918. 环形子数组的最大和:两种解法详解
前端·数据结构·算法·leetcode·typescript·动态规划·取反
愣头不青5 小时前
238.除了自身以外数组的乘积
数据结构·算法
爱编码的小八嘎6 小时前
C语言完美演绎4-4
c语言
汉克老师6 小时前
GESP5级C++考试语法知识(六、链表(一)单链表)
c++·链表·单链表·快慢指针·进阶·gesp5级·gesp五级
人工智能AI酱6 小时前
【AI深究】逻辑回归(Logistic Regression)全网最详细全流程详解与案例(附大量Python代码演示)| 数学原理、案例流程、代码演示及结果解读 | 决策边界、正则化、优缺点及工程建议
人工智能·python·算法·机器学习·ai·逻辑回归·正则化
WangLanguager6 小时前
逻辑回归(Logistic Regression)的详细介绍及Python代码示例
python·算法·逻辑回归
m0_518019486 小时前
C++与机器学习框架
开发语言·c++·算法