QuickSort #2

ims·2020년 9월 4일
0

알고리즘

목록 보기
2/23

코드

package CodingTest;

public class QuickSort {

    static void quick(int[] data,int start,int end){
        if (start >= end) {
            return;
        }
        int pivot = start;
        int left,right;
        int temp;

        left=start+1;
        right=end;

        while(left<=right){
            while(data[pivot]>=data[left]){
                left++;
            }
            while(data[pivot]<=data[right] && right>start){
                right--;
            }
            if(left<right){
                temp = data[left];
                data[left]=data[right];
                data[right]=temp;
            }else{
                temp = data[pivot];
                data[pivot]=data[right];
                data[right]=temp;
            }
        }

        quick(data,start,right-1);
        quick(data,right+1,end);

    }

    public static void main(String args[]){
            int[] data = {3,4,21,112,53,6,7,};

            quick(data,0,6);

            for(int i:data){
                System.out.println(i);
            }
    }
}

If & While

while, if문에 대한 생각

while : 검수의 느낌

while 안의 조건문은 원하는 바와 반대로 들어가야 한다.

ex) i가 3보다 클 때

A: while(i<3) { i++ }

  1. 조건문이 i>3이 아니라, i<3으로 반대로 들어갔다.
  2. A while문을 지나면 i는 3보다 커졌다는 의미. 검수를 했다.

반대로 if는 일회성이며, 원하는 바와 조건식이 같다.

ex) i가 3보다 클 때

if(i>3)

QuickSort 유의점

if (start >= end) {
    return;
}

위의 조건식이 없으면 recursion에서 무한 loop을 돈다. ( end가 start보다 작아도 계속 돌기때문에 )

초기 조건식을 정하기 까다로웠었는데, while(left<right) 앞에 left가 무엇인지, right이 무엇인지 정해야 하는거 아닌가? 라는 생각이 들었다. 그래서 pivot값과 관련해서 [left는 pivot보다 큰 값이고, right는 pivot보다 작은 값을 명시하고 시작해야 한다고 생각이 들었다]A. 그런데 생각해보니,left 와 right이 무엇인지에 대한 초기 조건은 left=start, right=end로 적어두었다. 그리고 A 조건에 대한 조건은 초기 조건식의 다음 step으로 명시해주어야 할 조건이다. 고로 나는 조건식의 순서에 대해서 헷갈렸던 것이다.

조건과 근거를 나누어서 옮기고, 그것에 따라 이야기를 진행해야 하는데 그 생각에 있어서 이게 맞나? 라는 의심이 들면 진행하지 못한다. 생각이 틀린 방향이더라도 하나의 틀린 사례를 적립해서 길을 찾는다라고 생각해야 된다. 일단 생각은 끝까지 가야한다.

길을 찾으려면 가는 길에 선택을 했던 조건의 근거를 명확히 기록해두어야 한다.

큰 조건과 작은 조건

초기에 while(left<right) 을 정하기가 힘들었었는데 이유는 2가지였었다.

  1. 코드 이전에 생각(해법)이 존재. 코드는 매칭시키는 것. pivot보다 큰 놈의 인덱스 값이 pivot보다 작은 놈의 인덱스 값 보다 작을 때까지 = while(left<right). 그리고 이 매칭에 있어서 큰 조건과 작은 조건을 나누어야 범주화가 돼서 생각이 진행이 된다.
  2. 큰 조건과 작은 조건 생각. 큰 조건 = while(left<right) --> OK 그리고 작은 조건으로 진행 --> left>pivot, right<pivot ~~

조건을 계층화 시켜야 한다.

profile
티스토리로 이사했습니다! https://imsfromseoul.tistory.com/ + https://camel-man-ims.tistory.com/

0개의 댓글