C++实现排序算法之简单选择排序

一、算法思想
在待排序的数据中选择最大(小)的元素放在其最终的位置
基本操作:
1.首先通过n-1次关键字的比较,从n个记录中找出关键字最小的记录,将它与第一个记录交换
2.再通过n-2次比较,从剩余的n-1个记录中找出关键字次小的记录,将它与第二个记录交换
3.重复上述操作,共进行n-1趟排序后,排序结束
动态图如下:
在这里插入图片描述
举例说明:
在这里插入图片描述
C++代码如下:

#include <iostream>
#include <vector>
using namespace std;

vector<int> SelectSort(vector<int>list)
{
	vector<int>result;
	if (list.empty())  //判断list是否为空
		return list;
	result = list;
	
	for (int i = 0; i < result.size(); i++)  //从下标为0的元素开始
	{
		int k = i;                          //设置每次循环默认最小值为起始值
		for (int j = i + 1; j < result.size(); j++)  //从每次起始值的下一个位置开始
		{
			if (result[j] < result[k])  //将后面的元素与前面的元素进行比较
				k = j;                 //记录下每趟循环的最小值下标
		}
		if (k != i)                 //如果循环一次的最小值不是起始值,则交换起始值与最小值
		{
			int temp = result[k];
			result[k] = result[i];
			result[i] = temp;
		}
	}
	return result;
}

int main()
{
	int arr[] = { 6, 4, 8, 9, 2, 3, 1 };
	vector<int>test(arr, arr + sizeof(arr) / sizeof(arr[0]));
	cout << "排序前:" << endl;
	for (int i = 0; i < test.size(); i++)
	{
		cout << test[i] << " ";

	}
	cout << endl;

	vector<int>result = SelectSort(test);
	cout << "排序后:" << endl;
	for (int i = 0; i < result.size(); i++) {
		cout << result[i] << " ";
	}
	cout << endl;

	system("pause");
}

运行结果
在这里插入图片描述
二、算法分析

1.时间复杂度
简单选择排序的比较次数与序列的初始排序无关,例如n个元素,比较次数总是n-1次,而移动次数与初始排序有关,如果初始排序就位正序的话,那么移动次数为0;反之,则为n(n-1)/2;综上,简单选择排序的时间复杂度为O(n^2);

2.空间复杂度
需要两个辅助存储空间,用于保存最小值的索引和交换元素值,故为O(1)

参考:
https://cuijiahua.com/blog/2017/12/algorithm_5.html
https://www.bilibili.com/video/av38482612

  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值