在数据结构中学习过关于二分法排序的算法,但都是基于C语言或者C++使用指针的方法,自己因为要在项目中使用到此算法,才开始将原有的程序改写为Java语言的。具体的说明如下:
1、二分法查找插入位置
如果R[i]<R[m]成立,那右指针就要向左移动中间指针一位,否则,左指针要向左移动中间指针一位。反复查找,直到左指针大于右指针时停止。
2、后移
虽然我们很清楚的知道,我们需要后移那些排序码大于R[i]的记录,但难免会问自己这样几个问题。其实它相当于需要移动从i-1到左指针的记录。
3、插入
由1中得到的左指针其实就是元素要插入的位置。
4、具体的算法
public void TwoInsertSort( int[] data ) {
int left,right,num;
int middle,j;
for( int i = 1; i < data.length; i++ ) {
// 准备
left = 0;
right = i-1;
num = data[i];
// 二分法查找插入位置
while( right >= left ) {
// 指向已排序好的中间位置
middle = ( left + right ) / 2;
if( num < data[middle] )
right = middle-1; // 插入的元素在右区间
else
left = middle+1; // 插入的元素在左区间
}
// 后移排序码大于R[i]的记录
for( j = i-1; j >= left; j-- ) {
data[j+1] = data[j];
}
// 插入
data[left] = num;
}
}