二分排序 例子

题目:一个有序的数组,里面是一万个整数。随机切分两部分,然后互换位置。求一个数的位置

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;
}







}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 二分排序是一种比较常用的排序算法,它采用分治法,将一个数组分成两个子数组,然后对子数组分别进行排序,最后将排序好的子数组合并起来。具体实现步骤如下: 1.从中间开始找,将数组一分为二; 2.对每一个子数组进行排序; 3.将排序好的子数组合并起来; 4.重复以上步骤,直到整个数组有序。 ### 回答2: 二分排序,也称为折半排序,是一种基于分治策略的排序算法。该算法通过将待排序的数组分成两个子数组,然后分别对这两个子数组进行排序,最后再将两个有序的子数组合并成一个有序的数组。 下面是用易语言写一个二分排序例子: ``` // 定义一个函数,用于合并两个有序数组 sub MergeArray(arr1[], length1, arr2[], length2, result[]) var i = 0, j = 0, k = 0 // 将两个有序数组中的元素逐个比较并按顺序合并到结果数组中 while i < length1 AND j < length2 if arr1[i] < arr2[j] result[k] = arr1[i] i = i + 1 else result[k] = arr2[j] j = j + 1 k = k + 1 // 将剩余的元素加入结果数组 while i < length1 result[k] = arr1[i] i = i + 1 k = k + 1 while j < length2 result[k] = arr2[j] j = j + 1 k = k + 1 // 定义一个函数,用于实现二分排序 sub BinarySort(arr[], length) if length > 1 var mid = length DIV 2 var left[mid], right[length - mid], merged[length] // 将原数组分成两个子数组 for var i = 0 to mid - 1 left[i] = arr[i] for var i = mid to length - 1 right[i - mid] = arr[i] // 对两个子数组进行排序 BinarySort(left, mid) BinarySort(right, length - mid) // 合并两个有序子数组 MergeArray(left, mid, right, length - mid, merged) // 将合并后的数组覆盖原数组 for var i = 0 to length - 1 arr[i] = merged[i] // 程序入口 sub main() var arr[] = [10, 7, 8, 9, 1, 5] var length = 6 display "排序前的数组:" for var i = 0 to length - 1 display arr[i] BinarySort(arr, length) display "排序后的数组:" for var i = 0 to length - 1 display arr[i] pause ``` 以上代码使用了易语言的数组和循环语句,并定义了两个函数,分别用于合并两个有序数组和实现二分排序。在程序入口处,定义了一个待排序的数组,并调用BinarySort函数对数组进行排序。最后,输出排序前和排序后的数组结果。 ### 回答3: 二分排序也被称为折半插入排序,是一种基于插入排序算法的改进方法。下面我用易语言编写一个二分排序的示例代码: ``` // 定义一个函数,用于实现二分排序 Function BinarySort(Var arr[] As Integer, length As Integer) Var i, j, left, right, middle As Integer For i = 1 To length - 1 If arr[i] > arr[i + 1] Then Var temp As Integer = arr[i + 1] left = 0 right = i While left <= right middle = (left + right) / 2 If arr[middle] > temp Then right = middle - 1 Else left = middle + 1 End If End While For j = i + 1 To left + 1 Step -1 arr[j] = arr[j - 1] Next arr[left] = temp End If Next End Function // 调用函数进行二分排序 Var array[] As Integer = [22, 11, 33, 55, 44] Var length As Integer = SizeOf(array) / SizeOf(Integer) Call BinarySort(array, length) // 打印排序后的数组 For i = 1 To length Print(array[i]) Next ``` 以上代码实现了一个简单的二分排序。算法的思想是通过折半查找的方式在已经有序的子序列中插入新的元素,以保持整个序列有序。在每一轮排序中,通过比较当前元素与下一个元素的大小关系,确定是否需要进行插入操作,并使用二分查找确定插入的位置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值