排序算法——二分插入排序

  在直接插入排序中,需要将待排序的元素与有序区间中的元素一一比较,直到找到插入位置,因此,直接插入排序虽然简单易懂,但是效率很低,

元素比较的次数很多。为了减少元素的比较次数,我们在查找待排序元素的插入位置时,在有序区间内采用折半查找,这也就是二分插入排序的由来。

如果不明白我所说的“有序区间”是怎么回事的话,可以参见上一篇文章http://www.cnblogs.com/greedyco/p/7134572.html。

  二分插入排序的要点就是采用折半查找,来找到待排序元素的插入位置,然后移动元素,将待排序的元素插入序列中。

  算法实现如下:

  

#include <stdio.h>
#include <stdlib.h>

void BinInsertSort(int A[], int n)
{
    int i, j, low, mid, high, temp;
    for(i = 1; i <= n-1; i++)
    {
        temp = A[i];                    // 辅助变量temp用来保存待排序的元素
        low = 0;
        high = i-1;                     // 有序区间为[0,i-1]
        while(low <= high)              // 在有序区间内采用折半查找,找到插入位置
        {
            mid = (low + high)/2;
            if(A[mid] > temp)
                high = mid - 1;
            else
                low = mid + 1;
        }
        for(j = i-1; j >= high+1; j--)  // 移动元素,腾出空间
            A[j+1] = A[j];
        A[high+1] = temp;               // 将待排序的元素插入
    }
}

  相比直接插入排序,虽然二分插入排序大大减少了元素的比较次数,但是元素的移动次数并没有减少,因此该算法并没有从本质上提高算法的性能,

二分插入排序的时间复杂度仍为O(n2),空间复杂度为O(1)。

原文地址:https://www.cnblogs.com/greedyco/p/7147744.html