折半插入排序:
由于插入排序算法的基本思想是,将待排序元素插入到已经有序的元素序列的正确位置,因此,在查找正确插入位置时,可以采用折半查找的思想寻找插入位置。将这种插入排序称为折半插入排序。
实现代码:(C#实现)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int[] a=new int[]{45,23,56,12,97,76,29,68}; //待排序数组
int low = 0;
int high = 0;
int mid = 0;
for (int i = 1; i < a.Length; i++) //第一个数a[0]是有序的,所以从第二个数a[1]开始
{
low = 0; //折半所需要的最小索引值,最大索引值,中间索引值
high = i-1;
mid = (low + high) / 2;
int t = a[i]; //记录下来待比较的元素
while (low <= high)
{
mid = (low + high) / 2; //low,high变化后要重新计算mid值
if (t <= a[mid])//当待比较的元素小于在a[0]到待比较元素之间的中间元素的时候,那么待比较元素在前半部分
{
high = mid - 1;
}
else //说明待比较元素在后半部分
{
low = mid + 1;
}
}
for (int j = i; j > low; j--) { //找到待比较元素的插入位置low,将low后面的元素向后移动一个位置
a[j] = a[j-1];
}
a[low] = t; //将待比较的那个元素放到要插入的位置
}
for (int i = 0; i < a.Length; i++) {
Console.WriteLine(a[i]);
}
Console.ReadKey();
}
}
}
插入排序算法的整体平均时间复杂度为O(n^2).