二进制插入以与常规插入排序

时间:2016-03-01 05:31:43

标签: java sorting insertion-sort

所以我试图弄清楚如何正确使用二进制插入排序而不需要交换方法或类似的东西。我的一个朋友给了我对必要代码的粗略解释,但我似乎无法按照自己的意愿去做。

private static int binaryInsertionSort(int[] b)
{
    int left, right, middle, i, m;
    int compareCount = 0;
    for (int j = 1; j < b.length; j++)
    {
        left = b[j - 1];
        right = b[j + 1];
        if (b[j] < b[left])
        {
            i = left;
        }
        else
        {
            i = left + 1;
        }
        m = b[j];
        for(int k = 0; k < (j - i - 1); k++)
        {
            b[j - k] = b[j - k - 1];
            compareCount++;
        }
        b[i] = m;
    }
    return compareCount;
}

int compareCount仅仅是为了查看在该方法过程中执行了多少次比较。现在我要做的是以常规方式排列整数数组,特别是像b [0] = 1,b [1] = 2,...... b [63] = 64.我的主要方法我创建数组并反过来分配值:b [0] = 64,b [1] = 63等。如何让这段代码重新排列成我寻求的正常方式?我能够通过正常的插入排序非常简单地做到这一点,但这对我来说有点麻烦......

1 个答案:

答案 0 :(得分:0)

没关系。在经过多次修修补补并与其他朋友确定具体细节之后,我们设法确切了解了如何做到这一点。

public static int binaryInsertionSort(int[] b)
{
    int lo, mid, hi, temp;
    int compareCount = 0;
    for (int i = 1; i < b.length; i++) 
    {
        lo = 0; 
        hi = i;
        mid = i / 2;
        do 
        {
            if (b[i] > b[mid]) 
            {
                lo = mid + 1;
                compareCount++;
            } 
            else if (b[i] < b[mid]) 
            {
                hi = mid;
                compareCount++;
            } 
            else
            {
                compareCount++;
                break;
            }
            mid = lo + ((hi - lo) / 2);
        } while (lo < hi);
        if (mid < i) 
        {
            temp = b[i];
            for (int j = i - 1; j >= mid; j--)
            {
                b[j + 1] = b[j];
                compareCount++;
            }
            b[mid] = temp;
        }
    }
    return compareCount;
}

确实非常棘手,但努力带来了回报。无论没有人回答,我仍然感谢那些看过我问题的人。