我知道二进制搜索是如何工作的,也知道插入排序是如何工作的,但这段代码是关于二进制插入排序的,我在理解它是如何工作方面遇到了问题。
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)
答案 0 :(得分:2)
二进制插入排序作为插入排序,但它将插入点与实际插入的位置分开。
为数组实现的插入排序将在定位插入点的同时移动项目。在循环浏览项目以查找插入点时,它还会移动项目以便为插入腾出空间。
二进制插入排序将利用已排序的项目进行排序的事实,因此它可以使用二进制搜索来查找插入点。由于二进制搜索也不能移动项目以便为插入腾出空间,因此必须在找到插入点后的单独步骤中完成。
您想要解释的代码是移动项目以便为插入腾出空间的代码。