알고리즘/알고리즘

퀵 정렬 Quick Sort

호두밥 2021. 9. 21. 18:23

파티셔닝을 이용한 정렬방법

① 기준값을 정한다.
② 첫번째부터 차례로 비교해나가면서
    기준값보다 작으면 왼쪽 그룹의 끝자리+1과 위치를 바꾼다.

 

퀵 정렬의 수도코드

 

 

시간복잡도

Balanced Partitioning : 파티셔닝의 크기가 n/2로 줄어드는 경우
          =>  높이 logN * 각 층별 N번의 연산을 수행
          =>  O(NlogN)
UnBalanced Partitioning : 파티셔닝의 크기가 1과 n-1개로 줄어드는 경우
          => 높이 N-1 * 각 층별 N-1번의 연산을 수행 
          => O(N²)

 

* Unbalanced Partitioning(최악의 경우)를 피하기 위해 파티셔닝의 크기를 랜덤하게 가져가는  Randomized QuickSort가 등장함.

 

구현 JAVA

package algorithm;

import java.util.Arrays;

public class QuickSort {
	
	static int[] arr;
	static int[] tmp;
	
	public void quickSort(int start, int end) {
		
		if(start<end) {
			int mid = partition(start, end);
			quickSort(start, mid-1);
			quickSort(mid+1, end);
		}
		
	}

	private int partition(int start, int end) {
		
		int pivot = arr[end];	//파티션 비교 기준 -> 가장 끝 값
		
		/*하나씩 돌면서 pivot과 비교 > pivot보다 작으면 위치 바꾸기 */
		for(int i = start; i<end; i++) {
			if(arr[i]<pivot) {
				swap(i, start);
				start++;
			}
		}
		/*마지막 위치를 파티션 기준 위치(가운데)로 이동함. 
        start값이 계속 증가했으므로 pivot보다 작은 값의 마지막 위치임*/
		swap(start,end);
		
		return start;
	}

	public void swap(int a, int b) {
		int tmp = arr[a];
		arr[a] = arr[b];
		arr[b] = tmp;
	}


	public static void main(String[] args) {
		arr = new int[] {3, 5, 1, 6, 9, 2, 4};
		tmp = new int[arr.length];
		QuickSort f= new QuickSort();
		f.quickSort(0, arr.length-1);
		System.out.println(Arrays.toString(arr));
		
	}

}

 

출처