역배열 요소 찾기 - 시간 복잡도 O (lgn)
/**
*
* @author jiadongkai
* @date Dec 2, 2011
*
*/
public class BinSearch {
/**
* [1,2,3,4,5]
* arr num index, -1
* @param arr
* @param num
* @return
*/
public static int binSearch(int[] arr, int num){
int low = 0, high = arr.length-1;
int mid = 0;
while(low <= high){
count++;
mid = (low+high)/2;
if(arr[mid] == num) return mid;
if(arr[mid] < num)//
low = mid + 1;
else //
high = mid - 1;
}
return -1;
}
static int count ;
/**
* [1,2,3,4,5]->[4,5,1,2,3]
*
*
* mid , 。 low/mid-1 mid+1/high
*
* num ,
* ; num ,
* @param arr
* @param num
* @return
*/
public static int exBinSearch(int arr[], int num){
int low = 0, high = arr.length-1;
int mid = 0;
// num
// ,
boolean flag = false;
while(low <= high){
count++;
mid = (low + high)/2;
if(arr[mid] == num) return mid;
if( !flag && (arr[low] <= arr[mid-1])){
//
if((arr[low] <= num) && (num <= arr[mid-1])){
// num
System.out.println(" :"+(low)+" -> "+(mid-1));
flag = true;
high = mid -1;
}else{
// num
low = mid + 1;
}
continue;
}
if( !flag && arr[mid+1] <= arr[high]){
//
if( (arr[mid+1] <= num) && (num <= arr[high])){
// num
System.out.println(" :"+(mid+1)+" -> "+high);
flag = true;
low = mid+1;
}else{
// num
high = mid - 1;
}
continue;
}
// , num
if( arr[mid] < num )
low = mid + 1;
else
high = mid - 1;
}
return -1;
}
public static void main(String args[]){
int arr[] = {1,3,5,6,7,8,9,10,22,34,56,67,89,100};
int arr2[] = {67,89,100,1,3,5,6,7,8,9,10,22,34,56};
int demo[] = {1,3,5,11,100,56,90,1000};
for(int i : demo){
System.out.println("--------- i="+i+"-------------");
System.out.println( i + " index:" + binSearch(arr, i) );
System.out.println(" :"+count);
count=0;
System.out.println( i + " index:" + exBinSearch(arr2, i));
System.out.println(" :"+count);
}
}
}
//~~~~
-------비교 i=1--------------------1의 index:0 비교 횟수: 3의 질서수조 진입: 3->3 1의 index:3 비교 횟수: 4---------------비교 i=3------------3의 index:1 비교 횟수: 8의 index:1 비교 횟수: 3-------------------비교 i=5--------------------------5의 index:2 비교 횟수: 5의 index:5 비교 횟수: 4----------------비교 i=11-------11의 질서수조 진입 횟수: 7:ndex:-1 비교 횟수: 4 ---------비교 i=100-----------------100의 index:13 비교 횟수: 8 100의 index:2 비교 횟수: 2 -----------------비교 i=56-----------------56의 index:10 비교 횟수: 4 질서수조에 진입: 7 -> 13 56의 index:13 비교 횟수: 4 -----------------------------------비교 i=90-------------90의 index:-1 비교 횟수: 8 90의 index:-1 비교 횟수: 4 ----------------------------------------------------------------비교 횟수: 8 1000 index:-1 비교 횟수: 4
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[TIL] #8. 프로그래머스 String, Date전달받은 문자열의 길이를 반환한다. 만약 전달받은 문자열 중 하나라도 NULL이 존재하면, NULL을 반환한다. 인수로 전달받은 문자열이 특정 문자열에서 처음 나타나는 위치를 찾아서, 해당 위치를 반환한다. 만약 전...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.