算法是我们需要掌握的重要基础之一,本篇文章将开启算法系列文章,学好算法的一个重要方法就是积累,希望此系列可以积累越来越多的算法文章。
本篇文章主要讲解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。