首先说一下选择排序的基本算法思想:

如果有N个元素需要排序,那么首先从N个元素中找到最小的那个元素与第0位置上的元素交换,然后再从剩下的N-1个元素中找到最小的元素与第1位置上的元素交换,之后再从剩下的N-2个元素中找到最小的元素与第2位置上的元素交换,.......直到所有元素都排序好。

以从小到大排序为例:a[5]={3,5,4,1,0};

  1. 选择出5个元素中最小的0,与a[0],也就是3进行交换,交换后的序列变为{0,5,4,1,3};
  2. 选择出后面4个元素中最小的1,与a[1],也就是5进行交换,交换后的序列变为{0,1,4,5,3};
  3. 选择出后面3个元素中最小的3,与a[2],也就是4进行交换,交换后的序列变为{0,1,3,5,4};
  4. 选择出后面2个元素中最小的4,与a[3],也就是5进行交换,交换后的序列变为{0,1,3,4,5};

至此,a[5]中的5个元素都已经按照正序进行排列。

我们来总结一下算法是如何实现的:

  1. 首先,确定选择排序需要比较的轮数 i,从上面可以看出,每一轮选择排序完成后,都会新增1个排好序的元素;5个元素,比较了4轮后,4个元素已经有序,剩下的最后一个元素自然有序,所以 n 个元素需要比较的轮数为 n-1。
  2. 然后确定每轮目标值的下标 j,将 a[j] 的值与 a[i] 的值进行交换。
    1. 第0轮:a[0]与a[1]、a[2]、a[3]、a[4]依次进行比较,并取出a[0]、a[1]、a[2]、a[3]、a[4]中的最小值进行交换。
    2. 第1轮:a[0]已经有序,不用再进行排序,a[1]与a[2]、a[3]、a[4]依次进行比较,并取出a[1]、a[2]、a[3]、a[4]中的最小值进行交换。
    3. 第3轮:a[0]、a[1]已经有序,不用再进行排序,a[2]与a[3]、a[4]依次进行比较,并取出a[2]、a[3]、a[4]中的最小值进行交换。
    4. 第3轮:a[0]、a[1]、a[2]已经有序,不用再进行排序,a[3]与a[4]依次进行比较,并取出a[3]、a[4]中的最小值进行交换。

从上面可以看出,j 的开始值为 i+1 ,因为a[i+1]以及其后面的值需要与a[i]的值进行比较,然后满足条件进行交换。而 j 的最大值为数组的最大下标 n-1 。

确定好上面两条结论以后,我们开始用代码实现选择排序算法:

#include <iostream>
using namespace std;void selectSort(int *a,int len)
{for(int i=0;i<len-1;i++) //i控制排序的轮数,每一轮新增一个排好序的元素 {int min=a[i],min_flag=i,temp;/*注意:这里的每次内层循环结束后,需将min重置为a[i],以及将min_flag(flag记录最小值的下标)置为i,因为要防止某次a[i]的值已经是最大的值,导致内层循环里面的if语句没有执行,min_flag仍为上次内层循环时j的值,导致程序出错*/for(int j=i+1;j<len;j++)    //将没有排好序的序列进行循环,找出最小值 {if(a[j]<min)   //记录下最小值以及最小值的下标 {min = a[j];min_flag = j;}}temp=a[i];   //交换a[i]和min的值 a[i] = min;a[min_flag] = temp;}
}int main()
{int a[10] = {2,7,1,9,0,4,3,6,5,8};int len = sizeof(a)/sizeof(int);selectSort(a,len);for (int i=0;i<len;i++){cout<<a[i]<<" ";}return 0;
} 

得到正序排列的值: 0 1 2 3 4 5 6 7 8 9。

C++常见排序算法——选择排序算法相关推荐

  1. 常见排序算法详解(插入排序、希尔排序、选择排序、冒泡排序、快速排序)

    1.1 插入排序 步骤: 1.从第一个元素开始,该元素可以认为已经被排序 2.取下一个元素tem,从已排序的元素序列从后往前扫描 3.如果该元素大于tem,则将该元素移到下一位 4.重复步骤3,直到找 ...

  2. C语言排序算法 选择排序 插入排序 快速排序 qsort实现快排 堆排序

    常见排序算法 选择排序 选择排序(Selection sort)是一种简单直观的排序算法. 它的工作原理如下. 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素 ...

  3. 排序算法---选择排序(java版)

    简单选择排序 原理 选择排序(Selection Sort)的原理有点类似插入排序,也分已排序区间和未排序区间.但是选择排序每次会从排序区间中找到最小的元素,将其放到已排序区间的末尾. 简单选择排序执 ...

  4. C语言基础排序算法-选择排序

    C语言基础排序算法-选择排序 什么是选择排序? 选择排序(Selection sort)是一种简单直观的排序算法,第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从 ...

  5. 数据结构与就算法(选择排序)

    数据结构与就算法(选择排序) 数据!您好 2019-01-07 05:16:18 2736 收藏 17 版权 1>什么是选择排序,选择排序和插入排序的思想差不多,也分已排序区间和未排序区间,只是 ...

  6. 数据结构—排序算法总结(插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序、合并排序、计数排序)

    *排序 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作. 稳定性 在待排序的数组中,如果出现多个相同的关键字,例如:98751555512,中出现重复的数字,在 ...

  7. 排序算法(分类,时间复杂度)(快速排序,插入排序,希尔排序,选择排序,冒泡排序)

    1.排序算法 1.排序的分类 分为内部排序和外部排序,其中内部排序分为插入排序.选择排序.交换排序.归并排序和基数排序.插入排序包括直接插入排序和希尔排序:选择排序包括简单选择排序和堆排序:交换排序包 ...

  8. Java排序算法——选择排序

    Java排序算法--选择排序(Selection sort) 传送门 冒泡排序 插入排序 简述 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理如下.首先在未排序序列中找 ...

  9. C语言实现选择排序——简单选择排序算法

    C语言实现简单选择排序 文章目录 C语言实现简单选择排序 简单选择排序算法 1.交换操作 2.简单选择排序算法实现 项目完整代码 运行效果图 简单选择排序算法 1.交换操作 //交换实现 void s ...

  10. C语言——十四种内部排序算法【直接插入排序-冒泡排序-选择排序-插入排序-希尔排序-归并排序-快速排序-堆排序-折半插入排序-二分查找-路插入排序-表插入排序-简单选择排序-直接选择排序-树形选择】

    目录: 一:插入排序 A:直接插入排序 1.定义: 2.算法演示 实例1: 3.基本思想 4.排序流程图 实例1: B:希尔排序 1.定义: 2.算法演示 实例2: C:其他插入排序 a:折半插入排序 ...

最新文章

  1. 修改AspNetSqlMembershipProvider的密码规则
  2. 1.4 torch_向量/矩阵求偏导
  3. [Leetcode][第1392题][JAVA][最快乐前缀][KMP][字符串编码]
  4. 如何循环遍历document.querySelectorAll()方法返回的结果
  5. Git初学札记(七)————合并分支(merge)
  6. 漂亮的页面过渡动画源码
  7. linux 查找只读文件夹,Linux系统中查找命令find的使用方法(二)
  8. 孤独的个人在社会中生存应掌握的基本健康技能(个人分析)
  9. MySQL5.7新增Performance Schema表
  10. 【线段树求逆序数】【HDU1394】Minimum Inversion Number
  11. 用python编写仓库管理系统_花了一天做的一个简单的仓库管理系统
  12. STM32RBT6+RC522读取CPU卡demo
  13. php实现tptp客户端
  14. imperva 获取gti文档
  15. 微信小程序——获取用户个人信息
  16. echarts地图中显示数字或省份
  17. 统计学习方法——李航 笔记
  18. 净利环比缩水过半,Salesforce龙头地位不保?
  19. 刚刚结束一家公司的战略规划项目的感想
  20. 全面提升市域社会治理现代化建设发展水平的关键措施

热门文章

  1. PMP成本管理中的几个英文缩写
  2. 缓冲区溢出攻击(详细解析)
  3. Qt中提示“常量中有换行符“的解决方法
  4. 浅谈Activity启动流程
  5. 昨天我请教了几位大佬,他们告诉我要这样学习编程!
  6. 人见人爱!收款码背后的原理是什么?
  7. 获取dataGridView当前行的值
  8. 解决MySQl卸载卸不干净问题
  9. java编程中对大数据的处理
  10. 浅谈mysql 平衡二叉树理解_浅析二分查找,二叉树,平衡二叉树,B树,B+树