最近开始学习了算法,虽然现在学校有算法分析与设计这门课,但是上课的时候还是有点听不懂老师讲的太理论的东西。所以就上B站上找了一些视频资源,就给我找找了马士兵老师的2020年最新数据结构与算法集合,视频内容对于我这种小菜鸟来说还是挺简单易懂的,感兴趣的朋友可以去看一下。所以就在这做个笔记记录一下,如有内容错误,请大神指教。
选择排序
概念:
在一个数组中,先遍历数组找到最小的一个数的位置,然后将最小的数放在第一个位置上;后从第二个位置开始遍历找到第二个小的数放在第二个位置…依次遍历直到排好序。
看图可能会比较易懂,图如下:
第一次遍历找到最小值位置:看图可知最小数是2,它位置是3,所以把最小数2与最开始位置(就是0)的数做交换,其结果如下图所示:
第一次遍历结束后,第二次遍历就从位置1开始遍历找出最小的数,看图可知是3其位置是4,所以将最小数3与位置1交换,如图:
直到最后将数都排好序。
C++代码如下:
#include<iostream>
using namespace std;
int main(){
int a[]={5,3,6,8,1,7,9,4,2};
int size=sizeof(a)/sizeof(a[0]);//数组长度
for(int j=0;j<size-1;j++){
int minpos=j;//最小值位置
//找最小值
for(int i=j+1;i<size;i++){
if(a[minpos]>a[i])
minpos=i;
}
//数值交换
int temp=a[j];
a[j]=a[minpos];
a[minpos]=temp;
}
//输出最终结果
for(int i=0;i<size;i++)
cout<<a[i]<<" ";
return 0;
}
选择排序就是这样了,视频中还讲了关于选择排序的一个优化,就是遍历的时候不仅找出最小的数同时找出最大的数,然后将最小的数放在开头位置,最大的数放在末位置。在这我也尝试的写了一下这个优化后的代码。
优化后的C++代码:
#include<iostream>
using namespace std;
//专门用于交换的函数
void swap(int &a,int &b){
int temp=a;
a=b;
b=temp;
}
int main(){
int a[9]={5,3,6,8,1,7,9,4,2};
for(int i=0;i<9/2;i++){//外层遍历次数缩减为n/2(缩减了一半)
int minpos=i,maxpos=i;//最小值位置和最大值位置
for(int j=i+1;j<9-i;j++){ //找最大最小值时要记得遍历次数已缩减
if(a[minpos]>a[j]) minpos=j;
if(a[maxpos]<a[j]) maxpos=j;
}
//交换位置
swap(a[minpos],a[i]);
swap(a[maxpos],a[9-1-i]);
}
for(int i=0;i<9;i++)
cout<<a[i]<<" ";
return 0;
}
以上就是我的选择排序算法的总结了,欢迎大家指导。