题目:一个有序的数组,里面是一万个整数。随机切分两部分,然后互换位置。求一个数的位置
for example:
int[] numbers = {92, 99,101,102,104,105,109,110,115,166,300,400,500, 1, 12, 13, 34, 35, 56, 57};
public class Test
{
/**
* @param args
*/
public static void main(String[] args)
{
int[] numbers = {92, 99,101,102,104,105,109,110,115,166,300,400,500, 1, 12, 13, 34, 35, 56, 57};
// System.out.println(Test.getPosition(numbers, 0));
// System.out.println(Test.getPosition(numbers, 1));
// System.out.println(Test.getPosition(numbers, 11));
// System.out.println(Test.getPosition(numbers, 13));
// System.out.println(Test.getPosition(numbers, 33));
// System.out.println(Test.getPosition(numbers, 35));
// System.out.println(Test.getPosition(numbers, 43));
// System.out.println(Test.getPosition(numbers, 57));
// System.out.println(Test.getPosition(numbers, 66));
// System.out.println(Test.getPosition(numbers, 92));
// System.out.println(Test.getPosition(numbers, 97));
// System.out.println(Test.getPosition(numbers, 99));
// System.out.println(Test.getPosition(numbers, 100));
System.out.println(Test.getPosition(numbers, 400));
}
private static int getPosition(int[] numbers, int number)
{
int seperator = numbers[0];
int low = 0;
int high = numbers.length - 1;
while(low < high)
{
int mid = (low + high)/2;
int midNumber = numbers[mid];
if(midNumber == number)
{
return mid;
}
if(number == seperator)
{
return low;
}
if(number > seperator)
{
if(number > midNumber&& midNumber >= seperator)
{
low = mid + 1;
}else
{
high = mid - 1;
}
}else
{
if(number < midNumber&& midNumber < seperator)
{
high = mid - 1;
}else
{
low = mid + 1;
}
}
}
if(high >= 0&& numbers[high] == number)
{
return high;
}
if(low < numbers.length&& numbers[low] == number)
{
return low;
}
return -1;
}
}
分享到:
相关推荐
首先,二次排序是在MapReduce框架内进行的一种特殊排序方式,它遵循两个主要步骤:第一字段排序和相同第一字段下的第二字段排序。这种排序模式确保了在处理大量数据时,具有相同第一字段的记录会聚集在一起,然后再...
该程序是我写的博客“一起talk C栗子吧(第二十五回:C语言实例-二分查找)”的配套程序,共享给大家使用
典型的例子是二分查找,它在有序数组中寻找目标值,每次将查找区间减半,直到找到目标或确定不存在。二分算法具有高效性,时间复杂度通常为O(log n)。 接着,**排序算法**是处理数据序列的常用工具。常见的排序算法...
但二分查找的前提条件是数据必须已经排序,如果数据未排序,需要先进行排序,这会增加额外的时间成本。 以下是二分查找的基本步骤: 1. 确定数组的中间索引,即 `mid = (left + right) / 2`。 2. 如果中间元素等于...
2. **二分查找**:适用于有序数组,通过不断取中间元素与目标比较来缩小搜索范围。时间复杂度为O(log n)。 3. **哈希查找**:通过哈希函数将目标元素映射到数组的特定位置,理想情况下查找只需要一次。但在存在冲突...
二分搜索算法是一种基于分治策略的高效查找算法,它适用于已排序的数组。在给定的数组`a[0 : 8]={1, 8, 12, 15, 16, 21, 30, 35, 39}`中,我们可以通过二分搜索来解决以下三个问题: 1) 查找30:二分搜索首先找到...
举一个整数区间上的二分查找的例子,假设我们有一个整数数组,并想找到数组中是否存在某个特定的数字。通过二分查找,我们可以快速判断出该数字是否存在数组中,如果存在,还能返回其索引位置。此外,二分查找还能...
在这个例子中,我们首先定义了二分查找函数`binarySearch`,然后在`main`函数中创建了一个已排序的数组,并调用`binarySearch`函数寻找目标值10。如果找到,输出其索引;如果没有找到,输出“元素不在数组中”。 二...
2. **查找失败时返回-1**:在二分查找过程中,如果从未排序的数组中找不到目标值,函数通常会返回一个特殊值表示查找失败。在这个例子中,返回值为-1,表示目标元素不在数组中。 3. **测试程序**:测试程序用于验证...
在这个例子中,`binary_search`函数实现了二分查找,`binary_insertion_sort`函数完成了整个排序过程。`print_array`函数用于输出排序后的数组。 总结来说,折半插入排序是插入排序的一种优化版本,通过结合二分...
例如,二分查找树(Binary Search Tree)在插入、删除和查找操作上具有很好的性能。 最后是递归。递归是解决问题的一种方法,它通过调用自身来解决子问题。在C#中,递归函数需要一个明确的终止条件,以防止无限循环...
二分检索是一种高效的查找算法,尤其适用于已排序的列表或数组。它的基本思想是通过不断将待搜索区域减半来快速定位目标值。在【标题】"4.4 二分检索1"中,我们可以看到这个主题是关于数据类型的运用,特别是关于二...
二分查找是一种在有序数组中寻找特定元素的搜索算法,其效率显著高于线性查找。本篇文章将详细探讨Java中的二分查找及其应用。 首先,我们要了解什么是数组。在计算机科学中,数组是一种数据结构,它存储了一组相同...
这个例子中的代码实现了二分插入排序的基本功能,但实际应用中可能需要进行错误处理和性能优化。二分插入排序虽然不是最高效的排序算法(如快速排序、归并排序等),但它具有稳定的排序特性,并且在特定场景下表现出...
- **交换排序**:通过元素间的相互交换来达到排序的目的,典型的例子如冒泡排序。 - **归并排序**:采用分治法的思想,将数组分成两半,递归地排序这两半,然后将它们合并成一个有序数组。 - **分配排序**:包括基数...
半插入排序,也称为二分插入排序,是一种在内部排序领域广泛应用的算法,尤其适用于小规模或部分有序的数据集。这种排序方法结合了直接插入排序的简单性和二分查找的效率,通过减少比较次数来提高排序性能。以下是半...
在数据量较少的情况下(),TimSort 使用插入排序,否则使用归并排序和二分搜索来提高排序效率。这种混合策略使得 TimSort 在排序性能上具有很高的稳定性和效率。 在以下的例子中,我们使用扑克牌对象来比较冒泡...
"不分伯仲"意味着两者没有明显的高低之分,这在数据排序中可能对应于相同的关键字值。 在具体操作中,排序一般包括以下几个步骤: 1. **选择数据范围**:首先,你需要选择要进行排序的数据区域。这可以通过点击并...
请注意,这段描述提到这是“萌新代码”,所以可能不会包含优化措施,例如二分查找法来提高插入操作的效率。在实际应用中,对于大型数据集,插入排序的效率相对较低,更适合于小型或者部分有序的数据。 总的来说,...
折半插入排序是在直接插入排序的基础上,利用二分查找法减小了查找插入位置的时间复杂度,提高了效率。希尔排序是一种改进的插入排序,通过设置间隔序列,使得原本远距离的元素有机会提前进行比较,从而减少了排序...