插入排序
个人理解
前提:有序序列
插入排序算法即线性插值的算法,假设有序序列是线性的,那么我们依照坐标直线的等效插值算得依照线性方法得到的下标位置,那么就可得到一个最接近的下标值。
当然越接近线性排序的,查找的速度就越快。反之,像{1,2,3,2000,2001,2002,2003…}这种,就不是很适合。
实现之
package search;
public class InsertValueSearch
{
public static void main(String[] args)
{
int arr[] =
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
System.out.printf("查找结果是%d", insertValueSearch(arr, 0, arr.length - 1, 7));
System.out.println();
System.out.println("----------------------------------");
System.out.printf("查找结果是%d", insertValueSearch(arr, 0, arr.length - 1, 10));
}
public static int insertValueSearch(int[] arr, int left, int right, int findVal)
{
// 以防越界,超出限制则搜索不到
if (findVal < arr[left] || findVal > arr[right])
{
return -1;
}
int mid = left + (right - left) * (findVal - arr[left]) / (arr[right] - arr[left]);
int index = -1;
while (left <= right || left >= 0 || right <= (arr.length - 1))
{
if (arr[mid] == findVal)
{
index = mid;
break;
} else if (findVal > arr[mid])
{
left = mid + 1;
} else
{
right = mid - 1;
}
mid = left + (right - left) * (findVal - arr[left]) / (arr[right] - arr[left]);
}
return index;
}
}