博客中代码都经过运行并且没有bug
static int[] sortArray = {-1, 8,12,20,19,33,1,7,6};//sortArray[0]上的数不参与排序,插入一个无意义的数字,
//以后用来充当哨兵
///直接插入排序 时间复杂度T(n)=O(n^2)
private static void InsertionSort()
{
int sortArrayLen = sortArray.Length - 1;
for (int i = 2; i <= sortArrayLen; i++)
{
if (sortArray[i] < sortArray[i - 1])
{
sortArray[0] = sortArray[i];//复制为监视哨
int j = 0;
for (j = i - 1; sortArray[0] < sortArray[j]; j--)
{
sortArray[j + 1] = sortArray[j];//记录后移
}
sortArray[j + 1] = sortArray[0];//插入到正确位置
}
}
}
/// <summary>
/// 折半插入排序 时间复杂度 T(n)=O(n^2)
/// </summary>
private static void BiInsertionSort()
{
int sortArrayLen = sortArray.Length - 1;
for (int i = 2; i <= sortArrayLen; i++)
{
if (sortArray[i] < sortArray[i - 1])
{
sortArray[0] = sortArray[i];//复制为监视哨
int low = 1, high = i - 1;
int mid = 0;
while (low <= high)
{
mid = (int)Math.Ceiling(((double)low + high) / 2);
if (sortArray[0] < sortArray[mid])
{
high = mid - 1;
}
else if (sortArray[0] == sortArray[mid])
{
break;
}
else
{
low = mid + 1;
}
}
if (low > high)
{
mid = low;
}
for (int j = i-1; j >= mid; j--)
{
sortArray[j + 1] = sortArray[j];//记录后移
}
sortArray[mid] = sortArray[0];
}
}
}
private static void ShowSortArray()
{
for (int i = 1; i <= sortArray.Length - 1; i++)
{
Console.Write(sortArray[i] + " ");
}
Console.WriteLine();
}
static void Main(string[] args)
{
//InsertionSort();
BiInsertionSort();
ShowSortArray();
//Console.WriteLine(Math.Ceiling(22.55));
Console.ReadKey();
}