折半插入排序
我们都知道,直接插入排序,每次都需要和已经排好序的子序列中的值比较一次,这是比较浪费时间的查找插入位置的方法,我们可以结合二分查找法来找到插入位置,这就是折半插入排序
算法思想
- 和直接插入算法一样,每次将无序子序列中的元素插入到有序子序列中
- 和直接插入算法不同的是,插入位置不再是依次比较,而是通过更有效率的二分查找法来寻找插入位置
- 找到位置后,将元素往后移动,放入待插值
算法实现
/**
* 折半插入排序
*/
void bInsertSort(int arr[],int n)
{
for (int i = 1; i <= n;i++)
{
int temp = arr[i];
int low = 0;
int high = i - 1;
while(low <= high)
{
int mid = (low + high) / 2;
if(arr[mid] > temp)
high = mid - 1;
else
low = mid + 1;
}
for (int j = i - 1; j >= high + 1;j--)
arr[j + 1] = arr[j];
arr[high + 1] = temp;
}
}
算法评价
- 时间复杂度:折半插入排序只是减少了元素的比较次数,其他的和直接插入排序还是一样的,所以时间复杂度还是
O(n^2)
- 空间复杂度:和直接插入排序一样,为
O(1)
- 稳定性:
稳定算法