C/C++选择排序算法

文章目录

例题

原理阐述

从小到大排序,每次选择序列的最小的一个数;

将原来的序列A分割为排好序的序列a和未排序的序列b;

从未排好序的序列b中找到最小值,插入到排好序的序列a后面,形成从小到大的序列。

依次循环,直到最后b序列剩下最后一个数。

时间复杂度分析

大循环为n,n为A序列的长度,小循环为m,m的取值依次为:"n,n-1,n-2,...,n-i"。
n ∗ n = O ( n 2 ) n*n=O(n^2) n∗n=O(n2)

题目思路

以上面的例题为例,样例输入十个整数作为一个序列A。

先将序列A的第一个数作为最小值min,再遍历整个序列,找到比min还小的数,记录下这个最小值对应的下标,再交换这个最小值与序列的第一个数,使得A序列的第一个数为最小值,此时A被分为已排序序列a,未排序序列b。

重复上面的操作,直到b为最后一个数。

代码实现

cpp 复制代码
#include<iostream>
using namespace std;
int main () {
	int a[10];
	for(int i=0;i<10;i++)
		cin>>a[i];
	

	//选择排序
	//每次选择最小的一个数
	for(int i=0;i<10;i++)
	{ 
		int minNum=a[i];
		int k=0;
		for(int j=i;j<10;j++){
			if(minNum>=a[j])
			{
				minNum=a[j];
				k=j;
			}
		}
		
		int temp = a[i];
		a[i]=a[k];
		a[k]=temp;
		
		if(i==9)
			cout<<a[i];
		else
			cout<<a[i]<<endl;
	}
	return 0;
}

总结

和冒泡排序类似,都是通过两层遍历。选择排序是每次找最小或者最大,并把它放到序列最前面,或者最后面。冒泡排序是通过两两交换,每次遍历也是确定序列的最大或最小值。两者对比来说,冒泡排序的交换平均频率比选择大的多,选择排序只需要找到最大或最小,再最后交换一次即可。冒牌则一直需要比较交换。

相关推荐
superman超哥2 分钟前
仓颉类型别名的使用方法深度解析
c语言·开发语言·c++·python·仓颉
是Yu欸20 分钟前
从Ascend C算子开发视角看CANN的“软硬协同”
c语言·开发语言·云原生·昇腾·ascend·cann·开放社区
黎雁·泠崖20 分钟前
C 语言字符串进阶:strcpy/strcat/strcmp 精讲
c语言·开发语言
superman超哥1 小时前
仓颉GC调优参数深度解析
c语言·开发语言·c++·python·仓颉
誰能久伴不乏1 小时前
Linux `epoll` 学习笔记:从原理到正确写法(含 ET 经典坑总结)
linux·服务器·网络·c++·ubuntu
(❁´◡`❁)Jimmy(❁´◡`❁)1 小时前
【算法】 二分图理论知识和判断方法
c++·算法
leaves falling1 小时前
c语言-三角形判断
c语言·开发语言
疑惑的杰瑞1 小时前
掌握 C 语言流程控制:分支、循环、goto 与表达式求值详解
c语言·开发语言·算法·算术转换
im_AMBER1 小时前
Leetcode 85 【滑动窗口(不定长)】最多 K 个重复元素的最长子数组
c++·笔记·学习·算法·leetcode·哈希算法
Dillon Dong1 小时前
按位或(|=)的核心魔力:用宏定义优雅管理嵌入式故障字
c语言·stm32