(个人算法笔记)排序算法之选择排序

最近开始学习了算法,虽然现在学校有算法分析与设计这门课,但是上课的时候还是有点听不懂老师讲的太理论的东西。所以就上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;
}

以上就是我的选择排序算法的总结了,欢迎大家指导。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值