排序算法——二分插入排序
在直接插入排序中,需要将待排序的元素与有序区间中的元素一一比较,直到找到插入位置,因此,直接插入排序虽然简单易懂,但是效率很低,
元素比较的次数很多。为了减少元素的比较次数,我们在查找待排序元素的插入位置时,在有序区间内采用折半查找,这也就是二分插入排序的由来。
如果不明白我所说的“有序区间”是怎么回事的话,可以参见上一篇文章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)。