Binary Selection Sort(二元选择排序)
来源:互联网 发布:安卓投屏软件 airplay 编辑:程序博客网 时间:2024/06/05 09:29
算法思想
二元选择排序是对简单选择排序(点击打开链接)的小改进,简单选择排序对序列每一次遍历只找出一个元素,而二元选择排序在每一次遍历中都会找出序列两端的元素(最大和最小),两端同时向中间逼近。这样理论上遍历的次数就减少了一半,加快了排序速度。
实现步骤
以从小到大排列为例1.遍历序列,找出最小元素和最大元素
2.将最小元素与无序部分第一个元素交换,最大元素与无序部分最后一个元素交换
3.更新无序部分边界
4.重复步骤1-3,直到无序部分不存在元素
源码
void BinarySelectionSort(int *a, int n){int i, j, min, max, minvalue, maxvalue;for (i = 0; i < n/2; i++) //外层循环控制无序部分的边界{min = max = i;for (j = i; j < n-i-1; j++){if (a[j] < a[min]){min = j;continue;}if (a[j] > a[max])max = j;}minvalue = a[min];maxvalue = a[max];a[min] = a[i];a[max] = a[n-i-1];a[i] = minvalue;a[n-i-1] = maxvalue;}}
第一段源码无论两端元素是否已经是最小(最大)值都进行交换,如果初始序列有相当一部分元素已经在正确的位置,这无疑增加了大量无意义的数值交换,下面是改进版:
void BinarySelectionSort(int *a, int n){ int i, j, min, max, minvalue, maxvalue; for (i = 0; i < n/2; i++) //外层循环控制无序部分的边界 { min = max = i; for (j = i; j < n-i-1; j++) { if (a[j] < a[min]) { min = j; continue; } if (a[j] > a[max]) max = j; }if (min != i){minvalue = a[min];a[min] = a[i];a[i] = minvalue;}if (max != n-i-1){maxvalue = a[max];a[max] = a[n-i-1];a[n-i-1] = maxvalue;} }}
第二段源码增加了判断条件,避免对已经有序的元素的数值交换。
时间复杂度
二元选择排序虽然将遍历次数减少了一半,但从时间复杂度来看与简单选择排序是一样的,都是O(n²),且两者对于同一序列的所需交换次数是一样的。稳定性
与简单选择排序相同,对于相等元素,二元选择排序会破坏它们的相对次序,因此属于不稳定的排序。阅读全文
0 0
- Binary Selection Sort(二元选择排序)
- 选择排序(selection sort)
- 选择排序(selection sort)
- 选择排序(selection sort)
- 选择排序(Selection Sort)
- 选择排序(Selection Sort)
- 选择排序(selection sort)
- Selection Sort(选择排序)
- 选择排序(selection sort)
- 选择排序(Selection Sort)
- selection sort 选择排序
- 选择排序 Selection Sort
- 选择排序(Selection Sort)
- 选择排序(Selection Sort)
- 选择排序 (Selection Sort)
- 选择排序(Selection sort)
- 选择排序 (Selection sort)
- 选择排序Selection sort
- 看国外女神级程序员,直播写代码一年的感悟
- hdu 4027
- Java中@Override的作用和用法
- poj 1147:Binary codes (置换群)
- 数据库SQL优化大总结之 百万级数据库优化方案
- Binary Selection Sort(二元选择排序)
- Mybatis if clause
- 深入理解Spring系列之十:DispatcherServlet请求分发源码分析
- 关于license
- CF623A Graph and String(二分图染色)
- 检验The Gauss-Bonnet Theorem
- Docker入门
- shell编程,正则表达式介绍,grep命令的使用
- JAVA学习总结之Map集合