折半插入排序相对于插入排序来说次数能少一点,因为插入时,前方元素已排序好,所以只用和中间那个元素比较,比中间元素小,那就从0——中间元素这一段继续和中间元素比较,依次类推下去。右边也一样。
代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 折半查找插入排序
{
class Program
{
static void Main(string[] args)
{
// 待排序的数组
int[] array = { 1, 0, 2, 5, 3, 4, 9, 8, 10, 6, 7 };
binaryInsertSort(array);
// 显示排序后的结果。
Console.WriteLine("排序后: ");
for (int i = 0; i < array.Length; i++)
{
Console.Write(array[i] + " ");
}
Console.ReadKey();
}
/// <summary>
/// 插入排序
/// </summary>
/// <param name="array">要排序的数组</param>
private static void binaryInsertSort(int[] array)
{
for (int i = 1; i < array.Length; i++)
{
int temp = array[i];
int low = 0;//左方元素下表为0
int high = i - 1;//我们要插入元素下标为i,所以已排序数组最右边下标为i-1
while (low <= high)
{
int mid = (low + high) / 2;//前方已排序数组1分为2
/*如果新加入元素比中间元素小,那就是使
* high=mid-1,而low不变,意思就是只用在左边
* 进行查找了
*/
if (temp < array[mid])
{
high = mid - 1;
}
/*新插入元素比中间元素大,那么就只用在右方查找了
* 让low=mid+1,而high不变
*/
else
{
low = mid + 1;
}
}
/*上方代码执行完毕之后low的前方应该插入我们想要
* 插入的元素,此时low后方元素整体后移一位
* 移动完之后low这个位置把我们要加进去的元素放进去
* 就OK了
*/
for (int j = i; j >= low + 1; j--)
{
array[j] = array[j - 1];
}
array[low] = temp;
}
}
}
}