选择排序总结以及排序算法的稳定性
选择排序介绍:
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始(末尾)位置,直到全部待排序的数据元素排完。选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)。
排序算法的稳定性:
排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同
如果相同,则是稳定的排序方法。
如果不相同,则是不稳定的排序方法
举例:
如果排序前的数组是[3,3,1]
,假定我们使用选择排序的话,那第一趟排序后结果就是[1,3,3]
。这个数组有两个相同的值,它俩在array[0]
和array[1]
,结果经过排序,array[0]
的跑到了array[2]
上了。
那么这就导致:2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序不相同,因此,我们就说它是不稳定的
稳定性的好处:
如果我们只对一串数字排序,那么稳定与否确实不重要,因为一串数字的属性是单一的,就是数字值的大小。但是排序的元素往往不只有一个属性,例如我们对一群人按年龄排序,但是人除了年龄属性还有身高体重属性,在年龄相同时如果不想破坏原先身高体重的次序,就必须用稳定排序算法。
只有当在“二次”排序时不想破坏原先次序,稳定性才有意义。
http://www.cnblogs.com/codingmylife/archive/2012/10/21/2732980.html
选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法,而冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法
选择排序的算法实现:
public class SelectionSort {public static void main(String[] args) {//记录当前趟数的最大值的角标int pos ;//交换的变量int temp;int[] arrays = {2, 5, 1, 3, 4};//外层循环控制需要排序的趟数for (int i = 0; i < arrays.length - 1; i++) {//新的趟数、将角标重新赋值为0pos = 0;//内层循环控制遍历数组的个数并得到最大数的角标for (int j = 0; j < arrays.length - i; j++) {if (arrays[j] > arrays[pos]) {pos = j;}}//交换temp = arrays[pos];arrays[pos] = arrays[arrays.length - 1 - i];arrays[arrays.length - 1 - i] = temp;}for (int i : arrays) {System.out.println(i);}}}
一个数组是需要
n-1
趟排序的(因为直到剩下一个元素时,才不需要找最大值)每交换1次,再次找最大值时就将范围缩小1
查询当前趟数最大值实际上不用知道最大值是多少,知道它的数组角标即可,交换也是根据角标来进行交换
选择排序总结以及排序算法的稳定性相关推荐
- 排序总结(排序算法稳定性、如何选择排序算法以及排序算法常见的坑)
一.稳定性 处理相等数时的态度,可以决定算法的稳定性 时间复杂度为O(N^2) 空间复杂度O(1)的排序: 选择排序:无稳定性 冒泡排序:有稳定性 插入排序:有稳定性 时间复杂度为O(N*logN)的 ...
- 数据结构与算法笔记 —— 十大经典排序及算法的稳定性
一.十大经典排序算法 排序算法是<数据结构与算法>中最基本的算法之一. 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全 ...
- 8个排序算法的稳定性总结
有时候做题,选择题,编程题,设计到排序的,都会要求说什么,相等元素,他们的额相对位置不变,开始还一头雾水,看讨论才知道这是排序的稳定性问题.先总结一下知识先,喝点汤补补 稳定性: 用一句话说就是数组中 ...
- 排序算法:冒泡排序、插入排序、选择排序、希尔排序
相关博客: 排序算法:冒泡排序.插入排序.选择排序.希尔排序 排序算法:归并排序.快速排序 排序算法:桶排序.计数排序.基数排序 排序算法:堆排序 十大排序算法小结 一.冒泡排序: 1.算法原理: 冒 ...
- 数据结构与算法:排序算法的稳定性以及各性能比较python实现
招聘笔试中经常会考到排序算法,在此做一个总结. 一.算法概念 1.排序算法的稳定性 假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[ ...
- 十大排序总结(js实现、稳定性、内外部排序区别、时间空间复杂度、冒泡、快速、直接选择、堆、直接插入、希尔、桶、基数、归并、计数排序)
目录 排序相关概念 稳定性 内部排序 外部排序 十种排序算法特点总结 交换排序 冒泡排序(数组sort方法的原理) 图解 js实现 特点 快速排序 图解 js实现 特点 选择排序 直接选择排序 图解 ...
- 十大排序算法:冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序
冒泡排序.选择排序.插入排序.希尔排序.归并排序.快速排序.堆排序.计数排序.桶排序.基数排序的动图与源代码. 目录 关于时间复杂度 冒泡排序 选择排序 插入排序 希尔排序 归并排序 快速排序 堆排序 ...
- 数据结构—排序算法总结(插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序、合并排序、计数排序)
*排序 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作. 稳定性 在待排序的数组中,如果出现多个相同的关键字,例如:98751555512,中出现重复的数字,在 ...
- 几种排序算法的稳定性分析
稳定指的是什么? 稳定排序是指原来相等的两个元素前后相对位置在排序后依然不变. 常见的几种排序算法稳定性分析 本文讨论的排序算法有以下这几种: 冒泡排序 选择排序 插入排序 希尔排序 归并排序 快 ...
最新文章
- PyTorch的torch.cat
- 异地多活实践与设计思考点归纳
- 河北高速盘点七大假牌假证违法案例:寒冬穿大裤衩开车
- 502 Bad Gateway nginx 解决
- Codeforces Round #626 (Div. 2) D. Present 按位贡献 + 快排新姿势
- POJ 1191 棋盘分割(区间DP)题解
- 想做点副业,一天200-300就行
- java实现栈的方法
- 【HeadFirst】设计模式
- CAJ格式文献转成PDF格式
- phpst安装memcache扩展_超简单的wordpress网站安装教程(基于phpstudy PHP环境)
- 【人机交互技术】工具软件界面设计
- java 一周前日期_java获取当前时间前一周、前一月、前一年的时间
- 机器学习之用Python梯度下降法实现预测
- 2018沈阳J How Much Memory Your Code Is Using?
- access h3c交换机光口_H3C交换机的端口配置
- 中国三千多省市区地名SQL
- 华为出品,必属精品!华为资深专家十年‘成神之作’网络协议宝典
- hexo下next主题实现鼠标移动特效
- Burp Suite的使用(常用模块)