二进制插入排序如何工作?

时间:2014-10-19 20:11:57

标签: c# sorting search

我知道二进制搜索是如何工作的,也知道插入排序是如何工作的,但这段代码是关于二进制插入排序的,我在理解它是如何工作方面遇到了问题。

static void Main(string[] args)
{
    int[] b = BinarySort(new[] { 4, 3, 7, 1, 9, 6, 2 });
    foreach (var i in b)
        Console.WriteLine(i);
}
public static int[] BinarySort(int[] list)
{
    for (int i = 1; i < list.Length; i++)
    {
        int low = 0;
        int high = i - 1;
        int temp = list[i];
        //Find
        while (low <= high)
        {
            int mid = (low + high) / 2;
            if (temp < list[mid])
                high = mid - 1;
            else
                low = mid + 1;
        }
        //backward shift
        for (int j = i - 1; j >= low; j--)
            list[j + 1] = list[j];
        list[low] = temp;
    }
    return list;
}

我不明白这部分是做什么的:

//backward shift
for (int j = i - 1; j >= low; j--)
    list[j + 1] = list[j];
list[low] = temp;

这里使用二进制搜索的目的是什么? 你能告诉我二进制插入排序是如何工作的吗? (c#console)

代码来源:http://w3mentor.com/learn/asp-dot-net-c-sharp/asp-dot-net-language-basics/binary-insertion-sort-in-c-net/

1 个答案:

答案 0 :(得分:2)

二进制插入排序作为插入排序,但它将插入点与实际插入的位置分开。

为数组实现的插入排序将在定位插入点的同时移动项目。在循环浏览项目以查找插入点时,它还会移动项目以便为插入腾出空间。

二进制插入排序将利用已排序的项目进行排序的事实,因此它可以使用二进制搜索来查找插入点。由于二进制搜索也不能移动项目以便为插入腾出空间,因此必须在找到插入点后的单独步骤中完成。

您想要解释的代码是移动项目以便为插入腾出空间的代码。