选择排序基本思想
简单选择排序的第i趟,总是从(elem[i],elem[i+1],...,elem[n-1])的未排序元素中选择最小的元素加入,然后只通过一次交换将当前最小的元素放在正确的位置。
最好、最坏、平均时间复杂度
都是,因为无论如何都要进行的循环次数是:
稳定性
选择排序是不稳定的!如序列[5 8 5 2 9], 我们知道第一次选择第1个元素5会和2交换,那么原序列中2个5的相对前后顺序就被破坏了,所以选择排序不是一个稳定的排序算法。
特性
1.思路简单,性能稳定,无论什么数据进去都是的时间复杂度。
2.不占用额外的内存空间。
//选择排序
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cmath>
using namespace std;
void swap(int a[],int elem1,int elem2)
{
int tmp = a[elem1];
a[elem1] = a[elem2];
a[elem2] = tmp;
}
void selectSort(int a[],int n)//选择排序:总是选择当前最小的元素加入序列
{
for(int i=0;i<n-1;i++)//依次遍历,寻找当前最小的元素
{
int lowIndex = i;//记录a[i,...,n-1]中最小的元素下标,为最后交换准备
for(int j=i+1;j<n;j++)
{
if(a[j]<a[lowIndex]) lowIndex = j; //更新
}
swap(a,lowIndex,i);//交换
}
}
int main(void)
{
int n = 10;
int arr[10] = {0};
for(int i=0;i<n;i++)
{
arr[i]=rand()%100;
}
for(int i=0;i<n;i++)
{
cout<<arr[i]<<" ";
}
cout<<endl;
selectSort(arr,n);
for(int i=0;i<n;i++)
{
cout<<arr[i]<<" ";
}
return 0;
}