一. 选择排序
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
二. 原理
n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果:
①初始状态:无序区为R[1..n],有序区为空。
②第1趟排序
在无序区R[1..n]中选出关键字最小的记录R[k],将它与无序区的第1个记录R[1]交换,使R[1..1]和R[2..n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
……
③第i趟排序
第i趟排序开始时,当前有序区和无序区分别为R[1..i-1]和R(i..n)。该趟排序从当前无序区中选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1..i]和R分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
如下图所示对数列 5 10 3 9 10 6 20 进行排序
三. 代码实现
#include
using namespace std;
void selectSort(int *arr, int len)
{
if(arr == NULL || len <= 0)
{
return ;
}
for(int i=0; i
三. 时间复杂度和空间复杂度及稳定性
1. 时间复杂度
从代码层面上看两层for循环,从原理上看,不管原序列是否有序,对于第i个位置元素的放置,都需要遍历n-i+1个数据,寻找这些数据中最大或最小的数据,所以选择排序的时间复杂度约为O(n*n)。
2. 空间复杂度
无论是从代码层面上还是理论层面上看除了使用局部的临时变量外,没有额外开辟空间,所以空间复杂度为O(1)。
3. 稳定性
从上面的例子中可以看出两个10在拍完序后交换了顺序,从理论上讲,选择排序过程中会有间隔的数据交换,所以不稳定。