排序算法 —— 选择排序
基本思想
每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在待排序的数列最前,直到全部待排序的数据元素排完。
具体步骤
1.读入数据存放在a数组中。
2.在a[1]~a[n]中选择值最小的元素,与第1位置元素交换,则把最小值元素放入a[1]中。
3.在a[2]~a[n]中选择值最小的元素,与第2位置元素交换,则把最小值元素放入a[2]中,……
4.直到n-1个元素与第n个元素比较排序为止。
实现方法
程序用两层循环完成算法,外层循环i控制当前序列最小值存放的数组位置,内层循环j控制从i+1到n序列中选择最小的元素所在位置k。
程序代码
#include <iostream>
using namespace std;
int main ()
{int n,temp,array[1000];cin>>n;array[0]=n;for (int i = 1; i <= n ; ++i){cin>>array[i];}for (int i = 1; i <= n; ++i){for (int j = i+1; j <= n; ++j){if(array[j]<array[i]){temp=array[i];array[i]=array[j];array[j]=temp;}}}for (int k = 1; k <= n; ++k){cout<<array[k]<<' ';}return 0;
}
测试
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <ctime>
using namespace std;
int main ()
{int n,temp,array[1000];
// cin>>n;
// array[0]=n;
// for (int i = 1; i <= n ; ++i)
// {// cin>>array[i];
// }n=1000;srand(time(NULL));for (int i=1;i<=n;i++)array[i]=rand()%10000;for (int i = 1; i <= n; ++i){for (int j = i+1; j <= n; ++j){if(array[j]<array[i]){temp=array[i];array[i]=array[j];array[j]=temp;}}}for (int k = 1; k <= n; ++k){cout<<array[k]<<' ';}cout<<endl;printf("Time used = %.7lf",(double)clock()/CLOCKS_PER_SEC);return 0;
}
算法分析
时间复杂度
选择排序的交换操作介于 0 和 (n - 1) 次之间。
选择排序的比较操作为 (n-1)+(n-2)+……+3+2+1+0=n (n - 1) / 2 次之间。
选择排序的赋值操作介于 0 和 3 (n - 1) 次之间。
比较次数O(n2),比较次数与关键字的初始状态无关,
总的比较次数N=(n-1)+(n-2)+…+1=n*(n-1)/2。
交换次数O(n),最好情况是,已经有序,交换0次;最坏情况交换n-1次,逆序交换n/2次。
交换次数比冒泡排序少多了,由于交换所需CPU时间比比较所需的CPU时间多,n值较小时,选择排序比冒泡排序快。
稳定性
选择排序是给每个位置选择当前元素最小的,比如给第一个位置选择最小的,在剩余元素里面给第二个元素选择第二小的,依次类推,直到第n-1个元素,第n个元素不用选择了,因为只剩下它一个最大的元素了。
那么,在一趟选择,如果一个元素比当前元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么交换后稳定性就被破坏了。
比较拗口,举个例子,序列5 8 5 2 9,我们知道第一遍选择第1个元素5会和2交换,那么原序列中两个5的相对前后顺序就被破坏了,所以选择排序是一个不稳定的排序算法。
排序算法 —— 选择排序相关推荐
- C语言基础排序算法-选择排序
C语言基础排序算法-选择排序 什么是选择排序? 选择排序(Selection sort)是一种简单直观的排序算法,第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从 ...
- C语言排序算法 选择排序 插入排序 快速排序 qsort实现快排 堆排序
常见排序算法 选择排序 选择排序(Selection sort)是一种简单直观的排序算法. 它的工作原理如下. 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素 ...
- Java排序算法——选择排序
Java排序算法--选择排序(Selection sort) 传送门 冒泡排序 插入排序 简述 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理如下.首先在未排序序列中找 ...
- python排序算法-选择排序
python排序算法-选择排序 一.选择排序 1.一趟排序纪录最小的数,放在第一个位置 2.再一次排序记录列表无序区最小的数,放在第二个位置 关键 有序区.无序区.无序区最小数的位置 代码 def s ...
- 十大经典排序算法-选择排序算法详解
十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...
- 排序算法-选择排序-堆排序
排序算法-选择排序-堆排序 堆排序是一种树型选择排序方法.在排序过程中,将 L [ 1... n ] L[1 ... n] L[1...n]看成是一棵完全二叉树的顺序存储结构,利用完全二叉树中双亲结点 ...
- 排序算法---选择排序(java版)
简单选择排序 原理 选择排序(Selection Sort)的原理有点类似插入排序,也分已排序区间和未排序区间.但是选择排序每次会从排序区间中找到最小的元素,将其放到已排序区间的末尾. 简单选择排序执 ...
- 排序算法--选择排序(Java实现)
选择排序概念 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中 ...
- 排序算法——选择排序法(Select Sorting)
选择排序(Select Sorting) 基本介绍 选择排序也属于内部排序法,是从预排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的 选择排序思想 选择排序(Selec ...
- [排序算法] 选择排序(2种)
1.直接选择排序 [思想]选出剩下的未排序数据中的最小元素与第i个元素交换 [特点]不稳定 空间代价:O(1) 时间代价:O(n^2) 1 void SelectSort(int Array[], i ...
最新文章
- 从前端角度来看网页设计
- c++中文件应用的一点小变化
- python映射类型包括哪三种_python新手入门必备——映射类型相关函数
- PHP预防XSS攻击,ajax跨域攻击的方法
- 由歌词引发的模式思考之下篇(模拟Spring的BeanFactory)
- PHP mongodb运用,MongoDB在PHP下的应用学习笔记
- 一个网卡绑定多个IP
- Xor Sum(AtCoder-2272)
- mybatis中refid是什么意思
- BrnShop开源网上商城第一讲:架构设计
- 常用头文件的可调用函数的归类笔记
- matlab 液压,基于MATLAB液压系统设计与仿真.doc
- 推荐一款特别厉害的在线工具,程序员的百宝箱
- TensorFlow2.0 Guide官方教程 学习笔记20 -‘Effective TensorFlow 2‘
- VMWare虚拟机下载|最新版|破解版
- ERP打印入库单(四十)
- Linux内核驱动开发-USB热插拔信息调取
- 优质的器材设备3d模型素材推荐,不容错过
- 微信小程序组件movable-area事件穿透,事件冒泡,movable-area遮盖/遮挡住其他元素之后点击事件不穿透/不冒泡解决办法
- 极米4K激光电视新品:一杯敬坚果, 一杯敬百度
热门文章
- 一些有趣的三方开源库
- struts 权限控制
- 在控制台读取用户输入密码,你会么?
- oracle11 for download official
- android 声音,同时播放声音Android
- java byte(字节_【原创】Java中Byte字节流处理的自定义方法库2
- java jms clust,Geoserver 的 JMS Cluster modules(集群数据同步)
- rs232读取智能电表_老王说表之--快速查看家里电表读数的方法
- python中的idle在哪里_python idle 的打开方式
- idea git 过滤target_IDEA + maven 零基础构建 java agent 项目