Binary Selection Sort(二元选择排序)
2017-10-03 12:07
1246 查看
算法思想
二元选择排序是对简单选择排序(点击打开链接)的小改进,简单选择排序对序列每一次遍历只找出一个元素,而二元选择排序在每一次遍历中都会找出序列两端的元素(最大和最小),两端同时向中间逼近。这样理论上遍历的次数就减少了一半,加快了排序速度。实现步骤
以从小到大排列为例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²),且两者对于同一序列的所需交换次数是一样的。稳定性
与简单选择排序相同,对于相等元素,二元选择排序会破坏它们的相对次序,因此属于不稳定的排序。相关文章推荐
- 二叉排序树BinarySortTree(二叉搜索树Binary Search Tree)
- java version: Simple Selection Sort
- RFD描述子简介—Receptive Fields Selection for Binary Feature Description
- 大话数据结构 code 第八章 02二叉排序树_BinarySortTree
- 树学习 --------- 二叉查找树/二叉搜索树(Binary Sort Tree)
- 数据结构基础(9)------------简单选择排序(Simple Selection Sort)
- 算法 - 排序 - 直接选择排序(Straight Selection Sort)
- 简单选择排序 Selection Sort 和树形选择排序 Tree Selection Sort
- STL之sort(),binary_search(),lower_bound(),upper_bound()函数
- 二叉排序树(Binary Sort Tree)
- search - binary search/sort tree
- Quick Sort & Binary Merge Sort
- 直接选择排序(Straight Selection Sort)
- PHP排序算法之简单选择排序(Simple Selection Sort)实例分析
- Binary Sort Tree
- BinarySortTree java python leetcode
- 简单选择排序 Selection Sort 和树形选择排序 Tree Selection Sort
- Binary Sort Tree(BST)
- 数据结构 - 折半插入排序(Binary Insertion Sort) 详解 及 代码(C++)