본문 바로가기
알고리즘/Samsung

정렬 알고리즘

by son_i 2023. 5. 18.
728x90

- 버블정렬

인접한 요소들끼리 비교 , 교환 과정의 반복 시간 복잡도 O(n^2)

		for(int k=0;k<arr.length;k++) {
			for(int j=0;j<arr.length-1;j++) {
				int temp =0;
				if(arr[j]>arr[j+1]) {
					temp = arr[j+1];
					arr[j+1] = arr[j];
					arr[j] = temp;
					System.out.print(arr[0]+" "+arr[1]+" "+arr[2]+" "+arr[3]+" "+arr[4]);
				}
		}System.out.println(" ");

 

- 선택정렬 : 배열요소에서 최솟값을 찾아 제일 앞에 가져다 놓고 이미 정렬된 값을 제외한 요소들에서 최솟값을 찾아 그 다음 앞에 가져다놓는 작업 반복 시간 복잡도 O(n^2)

배열의 제일 왼쪽부터 작은 값이 정렬됨.

		for(int i=0;i<arr.length;i++) {
			int temp = 0;
			for(int j=i+1;j<arr.length;j++) {
				if(arr[i] > arr[j]) {
					temp = arr[j];
					arr[j] = arr[i];
					arr[i] = temp;
				}
				System.out.print(arr[0]+" "+arr[1]+" "+arr[2]+" "+arr[3]+" "+arr[4]+" ");

			}
			System.out.println(" "+ count);

 

- 삽입정렬 : 인덱스 1부터 시작해서 기준이 되는 좌측의 요소들과 비교해서 swap해나감. 시간복잡도 O(n^2)

N사이클 수행 후 N+1개의 데이터가 정렬됨.

	for(int j=1;j<arr.length;j++) {
			int temp =0;
		for(int i=0;i<j;i++) {
			if(arr[i] > arr[j]) {
				temp = arr[j];
				arr[j] = arr[i];
				arr[i] = temp;
			}
				System.out.print(arr[0]+" "+arr[1]+" "+arr[2]+" "+arr[3]+" "+arr[4]+" ");

			}

-퀵 정렬 : pivot값을 기준으로 좌측에는 작은 값, 우측에는 큰 값을 계속해서 넣어가는 방식
n만큼 partition을 나누는데 나눌 때마다 데이터가 절반씩 줄어드니까 O(nlogn)의 평균 시간복잡도를 가짐. 최악은 O(n^2).

(한 번 돌 때마다 검색할 데이터가 절반씩 떨어지면 log n)

import java.io.BufferedReader;
import java.io.InputStreamReader;


class Solution{ //퀵 정렬 구현하기 ~~~
	public static void quicksort(int []arr) {
		quicksort(arr,0,arr.length-1);
	}
	public static void quicksort(int []arr,int start,int end) {
		int part2 = partition(arr,start,end);
		
		if(start < part2 -1) {
			quicksort(arr,start,part2-1);
		}
		if(part2 < end) {
			quicksort(arr,part2,end);
		}
	}
	public static int partition(int []arr, int start, int end) {
		int pivot = arr[(start+end)/2];
		while(start <=end) {
			while(arr[start] < pivot) start++;
			while(arr[end] > pivot) end --;
			
			if(start <= end) {
				swap(arr,start,end);
				start++;
				end--;
			}
		}
		return start; //새로 나눌 오른 쪽 파티션의 첫번째 인덱스가 들어감
	}
	public static void swap(int []arr,int start,int end) {
		int temp = arr[start];
		arr[start] = arr[end];
		arr[end] = temp;
	}
	public static void printArray(int []arr) {
		for(int i=0;i<arr.length;i++) {
			System.out.println(arr[i]);
		}
	}
	public static void main(String args[]) throws Exception{
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int T = Integer.parseInt(br.readLine());
		int arr[] = new int[T];
		for(int i=0;i<T;i++) {
			arr[i] = Integer.parseInt(br.readLine());
		}
		quicksort(arr);
		printArray(arr);
	}
}
728x90

'알고리즘 > Samsung' 카테고리의 다른 글

(자바) SWEA 11445. 무한 사전  (0) 2023.05.20
(자바) SWEA 15868. XOR 2차원 배열  (0) 2023.05.20
SW 14413. 격자판 칠하기 (BFS)  (1) 2023.05.14
SW 1288. 새로운 불면증 치료법  (0) 2023.05.05
SW 1928. Base64 Decoder  (0) 2023.05.05