C++常见排序算法——选择排序算法
首先说一下选择排序的基本算法思想:
如果有N个元素需要排序,那么首先从N个元素中找到最小的那个元素与第0位置上的元素交换,然后再从剩下的N-1个元素中找到最小的元素与第1位置上的元素交换,之后再从剩下的N-2个元素中找到最小的元素与第2位置上的元素交换,.......直到所有元素都排序好。
以从小到大排序为例:a[5]={3,5,4,1,0};
- 选择出5个元素中最小的0,与a[0],也就是3进行交换,交换后的序列变为{0,5,4,1,3};
- 选择出后面4个元素中最小的1,与a[1],也就是5进行交换,交换后的序列变为{0,1,4,5,3};
- 选择出后面3个元素中最小的3,与a[2],也就是4进行交换,交换后的序列变为{0,1,3,5,4};
- 选择出后面2个元素中最小的4,与a[3],也就是5进行交换,交换后的序列变为{0,1,3,4,5};
至此,a[5]中的5个元素都已经按照正序进行排列。
我们来总结一下算法是如何实现的:
- 首先,确定选择排序需要比较的轮数 i,从上面可以看出,每一轮选择排序完成后,都会新增1个排好序的元素;5个元素,比较了4轮后,4个元素已经有序,剩下的最后一个元素自然有序,所以 n 个元素需要比较的轮数为 n-1。
- 然后确定每轮目标值的下标 j,将 a[j] 的值与 a[i] 的值进行交换。
- 第0轮:a[0]与a[1]、a[2]、a[3]、a[4]依次进行比较,并取出a[0]、a[1]、a[2]、a[3]、a[4]中的最小值进行交换。
- 第1轮:a[0]已经有序,不用再进行排序,a[1]与a[2]、a[3]、a[4]依次进行比较,并取出a[1]、a[2]、a[3]、a[4]中的最小值进行交换。
- 第3轮:a[0]、a[1]已经有序,不用再进行排序,a[2]与a[3]、a[4]依次进行比较,并取出a[2]、a[3]、a[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.从第一个元素开始,该元素可以认为已经被排序 2.取下一个元素tem,从已排序的元素序列从后往前扫描 3.如果该元素大于tem,则将该元素移到下一位 4.重复步骤3,直到找 ...
- C语言排序算法 选择排序 插入排序 快速排序 qsort实现快排 堆排序
常见排序算法 选择排序 选择排序(Selection sort)是一种简单直观的排序算法. 它的工作原理如下. 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素 ...
- 排序算法---选择排序(java版)
简单选择排序 原理 选择排序(Selection Sort)的原理有点类似插入排序,也分已排序区间和未排序区间.但是选择排序每次会从排序区间中找到最小的元素,将其放到已排序区间的末尾. 简单选择排序执 ...
- C语言基础排序算法-选择排序
C语言基础排序算法-选择排序 什么是选择排序? 选择排序(Selection sort)是一种简单直观的排序算法,第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从 ...
- 数据结构与就算法(选择排序)
数据结构与就算法(选择排序) 数据!您好 2019-01-07 05:16:18 2736 收藏 17 版权 1>什么是选择排序,选择排序和插入排序的思想差不多,也分已排序区间和未排序区间,只是 ...
- 数据结构—排序算法总结(插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序、合并排序、计数排序)
*排序 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作. 稳定性 在待排序的数组中,如果出现多个相同的关键字,例如:98751555512,中出现重复的数字,在 ...
- 排序算法(分类,时间复杂度)(快速排序,插入排序,希尔排序,选择排序,冒泡排序)
1.排序算法 1.排序的分类 分为内部排序和外部排序,其中内部排序分为插入排序.选择排序.交换排序.归并排序和基数排序.插入排序包括直接插入排序和希尔排序:选择排序包括简单选择排序和堆排序:交换排序包 ...
- Java排序算法——选择排序
Java排序算法--选择排序(Selection sort) 传送门 冒泡排序 插入排序 简述 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理如下.首先在未排序序列中找 ...
- C语言实现选择排序——简单选择排序算法
C语言实现简单选择排序 文章目录 C语言实现简单选择排序 简单选择排序算法 1.交换操作 2.简单选择排序算法实现 项目完整代码 运行效果图 简单选择排序算法 1.交换操作 //交换实现 void s ...
- C语言——十四种内部排序算法【直接插入排序-冒泡排序-选择排序-插入排序-希尔排序-归并排序-快速排序-堆排序-折半插入排序-二分查找-路插入排序-表插入排序-简单选择排序-直接选择排序-树形选择】
目录: 一:插入排序 A:直接插入排序 1.定义: 2.算法演示 实例1: 3.基本思想 4.排序流程图 实例1: B:希尔排序 1.定义: 2.算法演示 实例2: C:其他插入排序 a:折半插入排序 ...
最新文章
- 修改AspNetSqlMembershipProvider的密码规则
- 1.4 torch_向量/矩阵求偏导
- [Leetcode][第1392题][JAVA][最快乐前缀][KMP][字符串编码]
- 如何循环遍历document.querySelectorAll()方法返回的结果
- Git初学札记(七)————合并分支(merge)
- 漂亮的页面过渡动画源码
- linux 查找只读文件夹,Linux系统中查找命令find的使用方法(二)
- 孤独的个人在社会中生存应掌握的基本健康技能(个人分析)
- MySQL5.7新增Performance Schema表
- 【线段树求逆序数】【HDU1394】Minimum Inversion Number
- 用python编写仓库管理系统_花了一天做的一个简单的仓库管理系统
- STM32RBT6+RC522读取CPU卡demo
- php实现tptp客户端
- imperva 获取gti文档
- 微信小程序——获取用户个人信息
- echarts地图中显示数字或省份
- 统计学习方法——李航 笔记
- 净利环比缩水过半,Salesforce龙头地位不保?
- 刚刚结束一家公司的战略规划项目的感想
- 全面提升市域社会治理现代化建设发展水平的关键措施