본문 바로가기

개발자노트

정렬) 퀵정렬 기본

package class05;

public class Test02 {
   //퀵정렬
   static void quick_sort(int[] data,int start,int end) {
      if(start>=end) { //만약에(정렬할 배열 요소가 없다면)
    	 return; // 3.반환값을 나를 호출한 위치로 전달 , 2.함수 즉시 종료
      }
	   int pivot=data[start];
      int L=start+1;
      int H=end;
      
      while(true) {  // 얼마만에 교환될지 모르기 때문에 무한루프
         while(pivot>data[L]) {
        	 if(L==end) { //L가 끝까지 도달했다면,
        		 break; // 그만해라.
        	 }
        	 L++; // ※ index 범위를 ++,--때에는 Exception에 유의하자! Exception에 유의하자!!
         }
         //ex ) [10 1 2 3 4 5 6 7 8 9] 피봇이 제일 큰 상태일 수도 있다. 
         
        while(pivot<data[H]) {
        	if(H==start) {
        		break;
        	}
        	H--;
        }
         System.out.println("L= "+L+"H= "+H);
         if(L>=H) { // 교차된다면
        	 int tmp=pivot;
        	 data[start]=data[H];   // 배열의 값을 교환한다!! 위치를 바꾸는게 아님!
        	 data[H]=tmp;
        	 break; // 멈춰라
         }
         int tmp=data[L];
         data[L]=data[H];
         data[H]=tmp;
         
        
         }
       quick_sort(data,start,H-1);  // 재귀함수 만들면 종료조건 만들기 필수!!
       quick_sort(data,H=1,end);
      }
   

   public static void main(String[] args) {
      // 재귀 함수???
      // 로직을 코드로 옮길수있나???
            
      int[] data= {5,1,9,10,4,2,7,3,6,8};
      
      for(int i=0;i<data.length;i++) {
         System.out.print(data[i]+" ");
      }
      System.out.println();
      
      quick_sort(data,0,data.length-1);
      // 메서드 시그니처: 함수 3요소-> input,output,기능
      // int[]x1,intx2  |  xxx(void)  |  퀵 정렬
      
      for(int i=0;i<data.length;i++) {
         System.out.print(data[i]+" ");
      }
      System.out.println();
   }

}