Quick sort

고독한 키쓰차·2021년 7월 15일
0

코딩테스트

목록 보기
3/16
public class quicksort {
	static int[] a;
	
	public static void main(String[] args) {
		a = new int[]{1,2,4,6,3,7,9,8,10};
		quick_sort(a,0,a.length-1);
		
		for(int i = 0; i < a.length; i++) {
			System.out.print(a[i]);
		}
		
	}

	public static void quick_sort(int[] data, int start, int end) {
		if (start >= end) {
			return;
		}
		int key = start;
		int i = start + 1;
		int j = end;
		int temp;
		
		while(i <= j) {
			while(i <= end && data[i] <= data[key]) {  // 키 값보다 큰 값 만날때 까지 이동 
				i++;
			}
			while(start < j && data[j] >= data[key]) { // 키 값보다 작은 값 만날때 까지 이동 
				j--;
			}
			if( j < i) { // 엇갈리면 키 값 교
				temp = data[j];
				data[j] = data[key];
				data[key] = temp;
			}else {
				temp = data[i];
				data[i] = data[j];
				data[j] = temp;
			}
		}
		
		quick_sort(data, start, j-1);
		quick_sort(data, j+1, end);
		
		
	}

}

맨 처음엔 그냥 외워서 코드 치다보니까 왜 이런지 이해가 되었다...
힝 오랜만에 좀 복잡한거 공부하니 집중도 잘 안되고 이해력도 현저히 떨어졌다.
지금까진 웜업이고.. 천천히 올려봐야겠다.

우선, 재귀를 짤때 먼저 탈출 조건을 만들어야 한다.
탈출 조건은, 1개만 남았을때, 즉 끝점이 피봇과 같아질때 끝내준다.

그리고 시작점은 피봇, 그리고 i,j를 피봇 다음 포인트와 끝점으로 세팅한다.

이제, i 와 j 를 옮겨줄건데, i는 끝 점 보다 넘겨버리거나, 자기자신보다 큰 값을 만날때까지,
그리고 j 는 피봇을 만날때 까지, 그리고 자기 자신보다 작은값을 만날때까지 가게된다.

그리고 이제 i와 j가 엇갈리게되면 피봇값을 j와 교환해준다. 그렇게 되면, 교환된 피봇값을 기준으로 왼쪽은 무조건 피봇값보다 작고 오른쪽은 큰 값이 된다.
그리고 이제 루프를 빠져 나오고 다시 퀵정렬을 j값은 고정이니 그 앞과 그 뒤로 돌려주면 된다.

만약 교차하는게 없을경우는 i의 위치와 j의 위치를 변경한다. 왜냐면 그렇게 해야 큰 값은 뒤로가고 작은 값은 앞으로 오니까. 그리고 이렇게 하는 순간 훗날에 교차하게될때 그 왼쪽값은 무조건 피봇보다 작은값이 된다.

profile
Data Scientist or Gourmet

0개의 댓글