【模板】选择排序

选择排序基本思想

简单选择排序的第i趟,总是从(elem[i],elem[i+1],...,elem[n-1])的未排序元素中选择最小的元素加入,然后只通过一次交换将当前最小的元素放在正确的位置。

最好、最坏、平均时间复杂度

都是o(n^2),因为无论如何都要进行的循环次数是:

\sum_{i=0}^{n-2}_(n-1-i) = n(n-1)/2

稳定性

选择排序是不稳定的!如序列[5 8 5 2 9], 我们知道第一次选择第1个元素5会和2交换,那么原序列中2个5的相对前后顺序就被破坏了,所以选择排序不是一个稳定的排序算法。

特性

1.思路简单,性能稳定,无论什么数据进去都是o(n^2)的时间复杂度。

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;
} 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值