C++算法基础(1)--选择排序详细讲解

算法是我们需要掌握的重要基础之一,本篇文章将开启算法系列文章,学好算法的一个重要方法就是积累,希望此系列可以积累越来越多的算法文章。

本篇文章主要讲解C/C++中的排序算法–选择排序(Selection Sort)。

一.选择排序简介

1.算法原理
在学好一个算法之前,我们需要理解其原理。

选择排序算法的原理是以下几个:
1).首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。
2).再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
3).以此类推,直到所有元素均排序完毕。

总结:选择排序就是从第一个数开始,与后面所有的数进行比较,找出最小的数,放在第一个位置,每一轮确定此轮最小的数。

在这里插入图片描述

2).时间复杂度
由于选择排序要经过两次for循环
所以,选择排序的时间复杂度为 O(n^2)。

3).流程图

在这里插入图片描述

4).选择排序的特性
在任何时候不管什么有序无序序列,它都要经过两次for循环
选择排序每一轮的第一个数和后面所有的数比较
选择排序给定位置去找数

二.选择排序实例演示详解

实例功能:
1.输入数组中元素的个数(数组大小)。
2.依次输入元素。
3.显示排序前元素顺序。
4.使用选择排序算法进行排序。
5.显示排序后的元素顺序。

void sort(int a[],int n);
void PrintArr(int a[],int n);
void sort(int a[],int n)
{
	int j,temp,i;
	for(i=0;i<n-1;i++)
	{
		for(j=i+1;j<n;j++)
		{
			if(a[i]>a[j])
			{
				temp=a[i];
				a[i]=a[j];
				a[j]=temp;
			}
		}
	}
}


void PrintArr(int a[],int n)
{
	int i;
	for(i=0;i<n;i++)
	{
		printf("%d",a[i]);
	}
}
int main(){
	int n,i,a[10];
	cout<<"请输入数组大小(元素个数):"<<endl;
	scanf("%d",&n);
	cout<<"请依次输入元素:"<<endl;
	for(i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
	}
	cout<<"排序前:"<<endl;
	PrintArr(a,n);
	cout<<"\n"<<endl;
	cout<<"排序后:"<<endl;
	sort(a,n);
	PrintArr(a,n);
	cout<<"\n"<<endl;
	return 0;
}

结果:
在这里插入图片描述
分析:
首先,定义了两个函数:排序函数sort()以及打印函数PrintArr()。

来看下sort()函数的实现:
1).定义三个整型变量 j,temp,i。
2).既然要对数组中的元素进行排序,那么,我们就将变量i和变量j设置为数组中的两个元素的位置
3).想要获得变量i和j对应的元素a[i]和a[j]且对它们进行排序,需要对数组进行循环遍历
4).先遍历i,i从数组下标0开始,即表示i是第一个元素下标,再对j使用内部遍历,j从i+1开始遍历,即表示j是i后面的元素下标。
5).当a[i]>a[j]时,说明数组前一个元素比后一个元素大,那么我们就需要进行元素位置调换,这时,使用temp作为中间变量实现赋值转换。
temp=a[i];//给temp赋值较大的元素
a[i]=a[j];//给a[i]赋值较小的元素
a[j]=temp;//给a[j]赋值temp
这样a[i]和a[j]就进行了排序。

结合实例分析步骤:
1).i=0,j=1,输入3,3,1,5,2,此时可以获取a[i]=a[0]=3,a[j]=a[1]=3。
2).判断a[i]是否大于a[j],如果大于则排序,此时都是3,不排序。
3).i=0,j=2,此时a[i]=a[0]=3,a[j]=a[2]=1,判断a[i]>a[j],进行排序,temp=a[i]=3,a[i]=a[j]=1,a[j]=temp=3。
4).此时a[0]=1,a[3]=3,j=j+1=3,a[j]=a[3]=5,不排序,a[j]=a[4]=2,不排序。第一轮结束顺序为1,3,3,5,2。
5).第二轮开始,i=1,a[i]=a[1]=3,a[j]=a[2]=3,不排序,以此类推,当a[j]=a[4]=2时,a[i]>a[j],排序,此时a[i]=a[1]=2,第二轮结束时顺序为1,2,3,5,3
6).以此类推,到第4轮时,a[i]=a[3]=5,a[j]=a[4]=3,a[i]>a[j],排序,a[i]=3,a[j]=5,第四轮结束后,顺序为1,2,3,3,5。

选择排序算法就讲解到这,希望通过讲解,大家能够更熟练地掌握此算法。

在这里插入图片描述在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值
>