插入排序之折半插入法

折半插入排序算法在一定程度上可以提升插入排序的速度。
其思想是:每次把待排序元素与其前面已排好的序列的中值相比较,从而寻找最终插入的位置。找到插入位置之后将前面元素往后覆盖,随即再将待排元素插入。
举个例子:(一部分)
在这里插入图片描述

那么可以看到先将待排序元素放到临时变量中,将它前面已排好序列的低位置设为low=left,高位置设为 high=i-1,那么每次取的中值就是mid=(low+high)/2,然后用临时变量与arr[mid] 比较,在低位置小于等于高位置时,如果临时变量小于中值,则high=mid-1,反之low=mid+1
low>high的时候,就说明已找到插入位置。
代码实现如下:

//折半插入排序
void Sort(int *arr,int left,int right)
{
    
    
	for (int i = left + 1; i < right; i++)
	{
    
    
		int temp = arr[i]; //用临时变量存放待排数据
		int low = left;
		int high = i - 1;
		while (low <= high)
		{
    
    
			int mid = (low + high) / 2;
			if (temp < arr[mid])
			{
    
    
				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; //插入位置
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_46078890/article/details/108834192