【基础算法】排序之选择排序

题目传送门

思路

选择排序的基本思想是:

找最小数:在未排序的部分中,找到最小的那个数。
交换位置:将这个找到的最小数与未排序部分的最开始位置上的数交换。

缩小未排序部分:之后我们就不再关心已经交换到前面的数了,因为它们已经是排好序的了。所以,我们只需要对剩下的部分继续执行上述两个步骤。
重复以上步骤,直到整个数组都被排好序。

那么代码就如下所示(附超详细代码注释):

CODE

#include <bits/stdc++.h>
using namespace std;
/* 选择排序 */
void selectionSort(vector<int> &nums) {
	// 定义一个函数,接受一个整数数组作为参数
	int n = nums.size(); // 获取数组的长度
	// 外循环:未排序区间为 [i, n-1]
	for (......) {
		// 从数组的第一个元素开始,到倒数第二个元素(因为最后一个元素会在前面的步骤中被排好序)
		// 初始化k为当前未排序区间的开始位置
		int k = i;
		// 内循环:找到未排序区间内的最小元素
		for (......) {
			// 从当前未排序区间的下一个元素开始,到最后一个元素
			// 如果找到一个更小的数
			if (......)
				k = j;
			// 更新k为更小数的索引
		}
		// 将该最小元素与未排序区间的首个元素交换
		swap(nums[i], nums[k]);
		// 将找到的最小数与当前未排序区间的开始位置的数交换
	}
}
int main() {
	int n;
	cin >> n; // 输入数组的长度
	vector<int>v(n);
	// 创建一个长度为n的整数数组
	// 读取数组中的每个元素
	for (......) {
		cin >> v[...];
	}
	// 调用选择排序函数对数组进行排序
	selectionSort(v);
	// 输出排序后的数组
	for (......) {
		cout << v[......] << " ";
	}
	return 0;
}

希望给你带来帮助,如果你 AC 了,请留下一个赞吧;如果没有 AC ,欢迎提问。

1 个赞

为啥在问题讨论区。
建议放在经验分享区

1 个赞

感谢你的建议

1 个赞

写的不错

1 个赞

谢谢

1 个赞

可以再写写冒泡排序和其他排序

已经写完冒泡和选择了

@览遍千秋 能写奇葩排序算法吗?

什么,猴子排序吗(

????