二分排序法貌似是第一次听说,在wangsifu2009的博客上看到。
以前只听说过堆排序、快排序、希尔排序、选择、插入、冒泡排序,于是在网上搜索了一下,其代码实现是这样的:
#include <stdlib.h>
#include <stdio.h>
void TwoInsertSort(int array[],int n)
{
int left,right,num;
int middle,j,i;
for(i = 1;i < n;i++)
{
left = 0;// 准备
right = i-1;
num = array[i];
while( right >= left)// 二分法查找插入位置
{
middle = ( left + right ) / 2; // 指向已排序好的中间位置
if( num < array[middle] )// 即将插入的元素应当在在左区间
right = middle-1;
else // 即将插入的元素应当在右区间
left = middle+1;
}
#include <stdio.h>
void TwoInsertSort(int array[],int n)
{
//每次查找完毕后,left总比right大一,a[left]总是存放第一个比num大的数,因此应从此处开始,每 //个元素右移一位,并将num存入a[left]中,这样就保证了a[0...i]是排好序的
for( j = i-1;j >= left;j-- )// 后移排序码大于R[i]的记录
array[j+1] = array[j];
array[left] = num;// 插入
}
}
}
看了以后就会发现,其实就是插入排序法的一种修改,当a[0],a[1]...a[i-1]排好序,寻找第i个元素在其中的位置时采用二分查找法,于是该算法称二分排序法,所以我认为这不是新的算法;另外有人说起时间复杂度是n*lgn的,其实不是,就算每次查找的时间是lgi,但是查找完毕还要移动元素,这个时间平均为i/2,于是总时间为(1/2+lg1) + (2/2 + lg2) + (3/2 + lg3) + ... + ((n-1)/2 + lg(n-1)), 约为n(n-2)/4+nlgn,所以时间复杂度还是n*n的。