蓝桥杯 选择排序

选择排序的思想

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

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

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

对于数组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; 
}
相关推荐
沈小农学编程几秒前
【LeetCode面试150】——202快乐数
c++·python·算法·leetcode·面试·职场和发展
ZZZ_O^O13 分钟前
【动态规划-卡特兰数——96.不同的二叉搜索树】
c++·学习·算法·leetcode·动态规划
XiaoCCCcCCccCcccC16 分钟前
Linux环境下的基础开发工具 -- 包管理器,vim,gcc/g++,make/makefile,git,gdb/cgdb
linux·c语言·gdb
一只小透明啊啊啊啊44 分钟前
Leetcode100子串
算法
木向44 分钟前
leetcode:114. 二叉树展开为链表
算法·leetcode·链表
sky_smile_Allen1 小时前
[C#] 关于数组的详细解释以及使用注意点
开发语言·算法·c#
机器视觉知识推荐、就业指导1 小时前
C++设计模式:原型模式(Prototype)
c++·设计模式·原型模式
希望有朝一日能如愿以偿1 小时前
力扣题解(新增道路查询后的最短距离II)
算法
清酒伴风(面试准备中......)1 小时前
操作系统基础——针对实习面试
笔记·面试·职场和发展·操作系统·实习
最后一个bug1 小时前
如何理解Lua 使用虚拟堆栈
linux·c语言·开发语言·嵌入式硬件·lua