//*******二分查找,都注释了,复制所有代码,保存成QuickSortApp.java*************//
class ArrayIns
{
private long theArray[];
private int nElems;
//--------------------
public ArrayIns(int max){ //构造方法,初始化成员属性。
theArray = new long[max];
nElems = 0;
}
//-----------------------
public void insert(long value){ //insert方法用于给数组赋值,并用nElems记录数组元素的个数。
theArray[nElems] = value;
nElems++;
}
//----------------------------
public void display(){ //display方法用于显示数组的所有元素到控制台。
System.out.println("A= ");
for(int j=0;j
System.out.println("");
}
//------------------------------
public void quickSort(){ //ArrayIns对象调用quickSort方法可以为其成员属性theArray数组中的元素排序(从小到大)
recQuickSort(0,nElems-1); //调用recQuickSort方法开始排序,初始范围从第一个到最后一个开始。
}
//-------------------------------
private void recQuickSort(int left,int right){ //recQuickSort方法进行数组元素的排序。left,right表示排序的范围.
if(right-left <= 0)
return; //如果right小于left,则第归返回。此处是第归的出口。
else {
long pivot = theArray[right]; //每次把排序范围中的最后一个数作为排序时的参照数。
int partition = partitionIt(left,right,pivot); //调用prititionIt方法,参数列表中指明排序的范围和参照数,并将方法的返回值赋给pritition变量(用来指明下一次排序时的范围。)
//System.out.print(" "+1); //数字1代表第一次第归的调用。
recQuickSort(left,partition-1); //第归调用本方法,排序右范围由partition-1来决定。
//System.out.print(" "+2); //数字2代表第二次第归的调用。
recQuickSort(partition+1,right); //第归调用本方法,排序左范围由partition-1来决定。
}
}
//-----------------------------------
private int partitionIt(int left,int right,long pivot){ //partitionIt方法完成left和right范围内元素间排序的具体过程。
int leftPtr = left-1; //leftPrt表示左标识位,从left-1开始。
int rightPtr = right; //rightPrt表示右表识位,到right。 while(true){//永真循环。
while(theArray[++leftPtr] < pivot); // 空循环,从leftPrt开始往rightPrt方向开始找一个比pivot大的数,用leftPtr记录元素的位置。
while(rightPtr>0 && theArray[--rightPtr]>pivot);//空循环,从rightPrt往leftPrt方向开始找一个比pivot小的数,用rightPrt记录元素的位置,并且rightPtr>0会保证不会数组越界。
if(leftPtr >= rightPtr) //永真循环的出口,表示本次排序结束。
break;//跳出循环。
else
swap(leftPtr,rightPtr);//将leftPtr和rightPtr所在位置的元素进行交换。
}
swap(leftPtr,right); //调用swap方法。
return leftPtr; //将leftPtr返回到本方法被调用的位置。用来指明下一次排序时的范围.
}
//---------------------------------------------
private void swap(int dex1,int dex2){ //swap方法用来将数组中的两个元素进行交换,dex1和dex2分别表示两个数组元素的位置。
long temp = theArray[dex1]; //temp变量作为两个数组元素交换时的临时中转变量。
theArray[dex1] = theArray[dex2];
theArray[dex2] = temp;
}
}//////////////////////////////////////////////////////////////////////////////////////class QuickSortApp
{
public static void main(String[] args)
{
int maxSize = 10; //定义变量maxSize,并赋初值10.
ArrayIns arr;
arr = new ArrayIns(maxSize);//创建ArrayIns类的对象arr for(int j=0;j
arr.insert(n); //用insert方法为arr中的成员数组变量赋值。
}
arr.display(); //用display方法显示arr中成员变量数组中的所有元素。
arr.quickSort(); //用quickSort方法为arr成员变量数组中的元素按从小到大排序。
arr.display(); //显示。
}
}
public class test {
static int bsearch( int[] a, int v ) {
int l, r;
l = 0; r = a.length-1;
while ( l <= r ) {
int m = (l+r)/2;
if ( a[m] == v ) return m; else
if ( a[m] > v ) r = m-1; else
if ( a[m] < v ) l = m+1;
}
return -1;
}
public static void main( String[] args ) {
int[] a = { 1,3,5,7,9 };
for ( int i = 0; i < 10; ++i )
System.out.println( "find " + i + " at pos: " + bsearch( a, i ) );
}
}
二分法定义:
对于区间[a,b]上连续不断且f(a)·f(b)<0的函数y=f(x),通过不断地把函数f(x)的零点所在的区间一分为二,使区间的两个端点逐步逼近零点,进而得到零点近似值的方法叫二分法。
给定一个数组,我们要查找当前数据在数组中的位置,虽然可以使用循环一个个遍历,但是由于要使代码运行时间尽可能的小,所以我们要采用二分法来查找。
先上代码:
public class BinarySearch {
/**
* Searches element k in a sorted array.
* @param arr a sorted array
* @param k the element to search
* @return index in arr where k is. -1 if not found.
*/
public int binarySearch(int[] arr, int k) {
int a = 0;
int b = arr.length;
// Loop invariant: [a, b) is a valid range. (a <= b)
// k may only be within range [a, b).
while (a < b) {
int m = a + (b - a) / 2; // m = (a + b) / 2 may overflow!
if (k < arr[m]) {
b = m;
} else if (k > arr[m]) {
a = m + 1;
} else {
return m;
}
}
return -1;
}
public static void main(String[] args) {
BinarySearch bs = new BinarySearch();
System.out.println("Testing normal data");
System.out.println(
bs.binarySearch(new int[]{1, 2, 10, 15, 100}, 15));
System.out.println(
bs.binarySearch(new int[]{1, 2, 10, 15, 100}, -2));
System.out.println(
bs.binarySearch(new int[]{1, 2, 10, 15, 100}, 101));
System.out.println(
bs.binarySearch(new int[]{1, 2, 10, 15, 100}, 13));
System.out.println("======");
System.out.println("Testing empty or singleton data.");
System.out.println(
bs.binarySearch(new int[]{}, 13));
System.out.println(
bs.binarySearch(new int[]{12}, 13));
System.out.println(
bs.binarySearch(new int[]{13}, 13));
System.out.println("======");
System.out.println("Testing data of size 2.");
System.out.println(
bs.binarySearch(new int[]{12, 13}, 13));
System.out.println(
bs.binarySearch(new int[]{12, 13}, 12));
System.out.println(
bs.binarySearch(new int[]{12, 13}, 11));
}
希望对您有所帮助!~