上一篇文章C语言排序方法-----选择排序法中分析了选择排序法,这篇文章分析一下选择排序法的优化算法,二元选择排序法,在选择排序法中每次找一个最大或者最小的数据放到开始位置,那么为了提高效率可以每次比较的时候同时找到最大值和最小值,一个放在数组头,一个放在数组尾,这样每次就可以排序两个数,比较的次数比选择排序法少一半。
下面直接看C代码的实现
void selectSortBinary( int num[], int count )
{
int i, j, max, min; //下标min max 指向最小和最大元素
int maxtmp = 0, mintmp = 0;
for( i = 0; i < count / 2; i++ ) //i跑 n/2趟排序就会排序完成
{
min = max = i; //先将max和min都指向待排序的第一个元素
for( j = i; j < count - i; j++ )
{
if( num[j] < num[min] ) //用j找出最大值和最小值,分别让max 和min指上来
{
min = j;
continue;
}
if( num[j] > num[max] )
{
max = j;
}
}
maxtmp = num[max]; //备份当前最大值和最小值
mintmp = num[min];
num[min] = num[i]; // 队首元素放在最小值下标处
num[max] = num[count - i - 1]; //队尾元素放在最大值下标处
num[i] = mintmp; //最小值放到队首
num[count - i - 1] = maxtmp; //最大值放到队尾
}
}
下面分析一下排序过程
用变量max存储最大值下标,min存储最小值下标。将数组中所有元素分析一遍后,就确定了最大值和最小值位置,然后将最大值9放在数组尾,将最小值0放在了数组首。
下来继续分析剩余的数字
将剩余数字中的最大值8和最小值1放在第二和倒数第二位置。
这样在数组排序最坏情况下,只需要5次就可以将所有数字排序完成。
下来分别测试一下最好情况和普通情况。
数组为最好情况下:
数组为普通情况下:
可以看出不论数组中的数组是那种情况,比较次数都是5次,比上一篇中分析的C语言排序方法-----选择排序法比较次数少了一半。
下面测试一下随机生成10000个数据,排序需要的次数和时间。
可以看到二元选择排序法比选择排序法在时间和比较次数上都少了一半。