读书人

2-路插入排序不要说网上有网上大多

发布时间: 2012-03-09 16:54:57 作者: rapoo

2-路插入排序,不要说网上有,网上大多是错的,或不是2-路插入排序
书上说2-路插入排序是在折半插入排序上的再改进。

可我在网上查了好久,发现大家的代码和折半插入排序没什么关系,那怎么叫做在折半插入排序上的改进呢?
void BidirSort(int a[],int tem[],size_t size)
{

int i,j;
tem[0]=a[0];
int first,final;
first=final=0;
for(i=1;i<size;i++)
{
if(a[i]>=tem[final])
{
tem[++final]=a[i];
}
else if(a[i]<=tem[first])
{
first=(first-1+size)%size;
tem[first]=a[i];
}
else //下面是直接插入排序,根本不是折半插入
{
j=final;
final++;
for(;a[i]<tem[j];j=(j-1+size)%size)
{
tem[(j+1)%size]=tem[j];
}
tem[(j+1)%size]=a[i]; //有人写成tem[j+1]=a[i]有错误,j==size怎么办?

}
}
for(j=0;j<size;j++,first=(first+1)%size)
a[j]=tem[first];

}
我理解的是当要插入的数小于final 大于first时用折半插入排序,不过该怎么取中间值?明显不是(final+first)/2

[解决办法]
以前总结的。。。

Java code
    public void sort(int[] array) {        if (array == null) {            System.out.println("array is null .");            return;        }        for (int i = 1; i < array.length; i++) {            int key = array[i];            int left = 0;            int right = i - 1;            int j = 0;            if (key >= array[right]) {                continue;            } else if (key <= array[left]) {            } else {                while (right-left>1) {                        j = (left + right) / 2;                    if (key == array[j]) {                        break;                    } else if (key < array[j]) {                                                right = j;                                        } else {                        left = j;                    }                }                j = right-left<=1?right:j;            }            for (int m = i; m > j; m--) {                array[m] = array[m - 1];            }            array[j] = key;        }    } 

读书人网 >软件架构设计

热点推荐