Algorithm/Algorithm Practice

2. 이진검색과 정렬(Java)

GrapeMilk 2020. 2. 25. 22:15

Goal 

 - 이진검색의 이해

 - 이진검색 알고리즘 C언어 및 Java언어로 구현 

 - 정렬의 이해 및 시간복잡도 비교 

1. 이진검색과 정렬

 

1-1 이진검색 (Binary Search)

 - 제어 검색의 일종인 이진 검색은 반드시 순서화된 파일이어야 검색할 수 있다.

 - 찾고자하는 값을 파일의 중간 값과 비교하며 검색함

 - 반쪽을 찾아보고 없으면, 크기 비교를 통해 왼쪽 또는 오른쪽으로 방향을 설정하고 나머지 반쪽에서 찾아가면서 범위를 점점 반씩으로 줄여가는 방법

 - 배열의 첫 값을 보통 First 마지막 값은 Last 중간값은 Middle이라고 함.

 

예제1) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15와 같이 레코드가 구성되어 있을 때, 이진 검색 방법으로 14를 찾는 경우 비교되는 횟수는? (답 : 3번)

 

1) 문자열 배열 data에서 target값의 index 찾기 예제 코드

 - 배열 data에 n개의 문자열이 오름차순으로 정렬되어 있음

 - 한 번 비교할 때마다 남아있는 데이터가 절반으로 줄어들기 때문에 시간복잡도는 O(log2n)이다.

 

int binarySearch(int n, char *data[], char *target) { //* 포인트 변수 선언. &(주소연산자)를 통해 주소를 저장 할 수 있음)
  int begin = 0, end = n-1;
  while(begin <= end) {
    int middle = (begin + end) / 2;
    int result = strcmp(data[middle], target);
    if (result == 0)
      return middle;
    else if (result < 0)
      begin = middle + 1;
    else
      end = middle - 1;
  }
  return -1;
}

/*
strcmp(s1, s2);와 같이 strcmp 함수에 비교할 문자열을 넣어주면 결과를 정수로 반환(문자열을 비교할 때 대소문자를 구분함).

-1: ASCII 코드 기준으로 문자열2(s2)가 클 때
0: ASCII 코드 기준으로 두 문자열이 같을 때
1: ASCII 코드 기준으로 문자열1(s1)이 클 때
*/

 

1-1) Java로 구현 

package inflearn.chapter1.algorithm;

import java.util.Arrays;
import java.util.Scanner;


public class BinarySearchImplement {

	public static void main(String[] args) {
	
	//  Scanner sc = new Scanner(System.in);
	  String[] str = {"kim", "berry", "back", "cris", "zcd", "jace", "jill"};
	  Arrays.sort(str); // 배열을 '가나다' 또는 'abc'순으로 정렬, int형 배열을 입력하면 '오름차순'정렬
	  System.out.println(Arrays.toString(str)); // for test
	  System.out.println(binarySearch(str.length, str, "jace"));
	  
	  
	 
	}
	
	static int binarySearch(int n, String[] data, String target) {
		
	  int first = 0, last = n-1;
	  while(first <= last) {
	    int middle = (first + last) / 2;
	    int result = data[middle].compareTo(target);
	    if (result == 0)
	    	return middle;
	    else if (result < 0)
	    	first = middle + 1;
	    else 
	    	last = middle - 1;
	  }
	  return -1;
	}
	
}


/*
 * String 배열 출력 (Arrays.toSting())
 * 배열 오름차순, 내림차순 정리 (Arrays.sort() / Arrays.sort()이후 
*/

 

- 데이터가 '연결리스트'에 오름차순으로 정렬되어 있다면?

 - > 연결리스트에서는 가운데(middle) 데이터를 O(1)시간에 읽을 수 없기 때문에 이진검색 불가.

- 즉, 순차검색의 시간복잡도는 O(n)이고 이진검색 O(log2n)이다.

 

1-2 정렬 (Sort)

 - 파일을 구성하는 각 레코드(테이블에서 가로)들을 특정 키 항목(테이블에서 세로, 속성)을 기준으로 오름차순(Ascending) 또는 내림차순(Descending)으로 재배열하는 작업. 

 

1) 정렬 알고리즘 시간 복잡도 비교

 

 

 

 

 

- 참고 자료 

*Java 패키지 네이밍 

참고 : https://codedragon.tistory.com/228 

*C언어에서 *의 의미

참고 : http://mwultong.blogspot.com/2007/05/c-asterisk-pointer-operator.html

*배열 오름차순(Arrays.sort()) 내림차순 (3가지 방법)

참고 : https://m.blog.naver.com/PostView.nhn?blogId=james2021&logNo=30090781371&proxyReferer=https%3A%2F%2Fwww.google.com%2F  

*Java 두 문자열 비교하는 3가지 방법(equal, ==, compareTo)

참고 : https://tworab.tistory.com/16 

*정렬 알고리즘 내용참고

참고: https://gmlwjd9405.github.io/2018/05/06/algorithm-bubble-sort.html