目录
前言
排序是重要又较为简单的算法之一,个人认为学习算法建议先学习排序,排序有十种重要的排序方法,有些好,有些坏。
十大排序算法包括哪些
十大排序算法包括冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序。
今天我来讲讲选择排序。
选择排序原理
选择排序是一种简单直观的排序算法,其工作原理是通过每一趟从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余未排序的元素中继续寻找最小(或最大)元素,放到已排序序列的末尾,以此类推,直到全部待排序的数据元素排完。
选择排序基本信息
英文名 | selection sort |
时间复杂度 | O(n^2) |
空间复杂度 | O(1) |
是否稳定 | 否 |
代码实现
代码思路
首先需要一个标志变量minid = i。
接着从minid+1开始遍历整个数组。
如果发现有有比a[minid]还小的数,那么就将minid设置成j。
在遍历完之后,记得把a[i]和a[minid]交换一下哦~
代码实现
/*头文件部分*/
#include <iostream>
#include <algorithm>
using namespace std;
/*选择排序部分*/
void Selection_sort() {
int a[100001], n;
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
for (int i = 1; i <= n; i++) {
int minid = i;
for (int j = i + 1; j <= n; j++)
if (a[j] < a[minid])
minid = j;
int t = a[i];
a[i] = a[minid];
a[minid] = t;
}
/*输出数组部分*/
for (int i = 1; i <= n; i++)
cout << "第" << i << "个数:" << a[i] << endl;
}
/*主函数部分*/
int main() {
Selection_sort();
return 0;
}
实例
【模板】排序
题目描述
将读入的 N 个数从小到大排序后输出。
输入格式
第一行为一个正整数 N。
第二行包含 N 个空格隔开的正整数 ai,为你需要进行排序的数。
输出格式
将给定的 N 个数从小到大输出,数之间空格隔开,行末换行且无空格。
样例1
样例输入1
5
4 2 4 5 1
样例输出1
1 2 4 4 5
本题来自洛谷题目P1177 【模板】排序https://www.luogu.com.cn/problem/P1177
代码
#include <iostream>
#include <algorithm>
using namespace std;
void Selection_sort() {
int a[100001], n;
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
for (int i = 1; i <= n; i++) {
int minid = i;
for (int j = i + 1; j <= n; j++)
if (a[j] < a[minid])
minid = j;
int t = a[i];
a[i] = a[minid];
a[minid] = t;
}
for (int i = 1; i <= n; i++)
cout << a[i] << " ";
cout << endl;
}
int main() {
Selection_sort();
return 0;
}
总结
选择排序(Selection Sort)是一种简单直观的排序算法,其基本思想是通过多次遍历数组,每次找出剩余未排序部分的最小(或最大)元素,将其放到已排序序列的起始位置,直到整个序列排序完成。
基本思想
选择排序的基本思想是:
- 多趟选择:通过n-1趟选择操作,每趟从剩余未排序的元素中找到最小(或最大)的元素,然后将其放到已排序序列的末尾。
- 逐步排序:每趟选择后,已排序的元素序列逐步增长,未排序的元素序列逐步减少。
算法步骤
- 初始化:将第一个元素设为最小值。
- 遍历:遍历剩余的元素,找到最小(或最大)的元素。
- 交换:将找到的最小(或最大)元素与第一个位置的元素交换。
- 重复:重复上述步骤,直到整个列表排序完成。
时间复杂度与空间复杂度
- 时间复杂度:选择排序的平均时间复杂度和最坏时间复杂度均为O(n^2),因为每次选择最小元素时都需要遍历未排序的部分。
- 空间复杂度:O(1),因为选择排序是就地排序,不需要额外的存储空间。
你学废了吗?
下期预告:十大排序算法之冒泡排序