基础介绍
选择排序算法的核心思想:
- 将整个待排序的数据作为一个集合
- 从这个集合中按一定规则找到最大或者最小值
- 从这个集合中去去掉找到的数据,这样就出现了一个子集
- 重复1-3的步骤,找到所有的数据都找到。
选择排序的重点是从剩余部分进行遍历查找。
示例
cpp
#include <iostream>
#include <array>
using namespace std;
//选择排序
//选择排序的核心思想:首先从一个总集合中找到最大或最小的值,并将找到的值放到头部(这里面涉及到一个交换),然后再该集合中去除这部分,然后在
//剩下的集合中重复刚才的过程
//这里对一个数组进行排序,要求使用选择排序算法来完成
//分析,如果对这个数组进行排序,设计一个排序桉树,输入是一个数组,输出也是这个数组,无返回值
//这里的排序从大到小进行排序
void selectSort(array<int,7>& arr)
{
//首先找到数组的长度
int length = arr.size();
cout <<"size = "<<length<<endl;
//这里需要建立2个循环,第一个循环的索引依次向右移动,第二个循环的起始索引以第一个循环的当前索引值为起点
//由于涉及位置交换,所以这里需要定义一个临时变量,用于交换数据使用,另外要记录中间的最大值,所以还需要一个
//变量,该变量存储找到的最大值索引值,另外还有一个过程变量,用于过程中找到的最大值
for(int i = 0; i < length; i++)
{
//这里必须放在这里,每次在剩下的集合中查找最大值都需要初始化这两个过程变量
int maxNum = arr.at(i);
int maxIndex = i;
for(int j = i; j < length; j++)
{
if(arr.at(j) > maxNum)
{
maxNum = arr.at(j);
maxIndex = j;
}
}
cout <<"maxIndex = "<<maxIndex<<endl;
//查找完成后,需要交换位置
if(maxIndex != i)
{
int value = arr.at(i);
arr[i] = arr.at(maxIndex);
arr[maxIndex] = value;
}
//啥也不干
else
{
}
}
return ;
}
int main(int argc, char *argv[])
{
array<int,7> arr{4,3,5,1,2,8,6};
selectSort(arr);
for(int i = 0; i < arr.size(); i++)
{
cout << arr.at(i)<<endl;
}
return 0;
}
时间复杂度分析
采用大O表示法,通过上面的例子来分析这个算法的时间复杂度,假设有n个数据:
- 第一层遍历需要遍历n次
- 第二层循环的遍历次数依次为n, n-1, n-2,1
- 计算两次循环的总次数为n*n+n*(n-1)+...n*1=n*(n+1)/2=n*n/2+n/2
- 大O表示法去掉低次项,去掉常数项,从而得出时间复杂度为O(
)