您的位置:首页 > 其它

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²),且两者对于同一序列的所需交换次数是一样的。

稳定性

与简单选择排序相同,对于相等元素,二元选择排序会破坏它们的相对次序,因此属于不稳定的排序。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息