์ •๋ ฌ (Sorting)

๐Ÿ” ๊ฐœ์š”

  • ์‹œ๊ฐ„ ๋ณต์žก๋„ ๊ธฐ์ค€
    • O(Nยฒ) : ๋ฒ„๋ธ”, ์„ ํƒ, ์‚ฝ์ž… โ†’ N์ด ์ž‘์„ ๋•Œ๋งŒ ์‚ฌ์šฉ
    • O(N log N) : ํ€ต, ๋ณ‘ํ•ฉ, ํž™, Java ๋‚ด์žฅ ์ •๋ ฌ
    • O(N + K) : ๊ณ„์ˆ˜ ์ •๋ ฌ (Counting Sort, K=๊ฐ’์˜ ๋ฒ”์œ„)
  • ์ง์ ‘ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„๋ณด๋‹ค, ์ •๋ ฌ ๊ธฐ์ค€์„ ์–ด๋–ป๊ฒŒ ์ž˜ ์žก๋Š”์ง€๊ฐ€ ์ค‘์š”

๐Ÿ“š ์ •๋ ฌ ์ข…๋ฅ˜

1. ๊ธฐ๋ณธ ๋ฐฐ์—ด ์ •๋ ฌ

int[] arr = {5, 2, 9, 1};
Arrays.sort(arr); // ์˜ค๋ฆ„์ฐจ์ˆœ

2. ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ

Integer[] arr = {5, 2, 9, 1};
Arrays.sort(arr, Collections.reverseOrder());

3. ๊ฐ์ฒด ๋ฐฐ์—ด ์ •๋ ฌ (Comparator)

class Person {
	String name;
	int age;
	Person(String name, int age) {
		this.name = name;
		this.age = age;
	}
}
 
Person[] people = {
	new Person("kim", 25),
	new Person("Lee", 20),
	new Person("Park", 30)
};
 
// ๋‚˜์ด ์˜ค๋ฆ„์ฐจ์ˆœ
Arrays.sort(people, Comparator.comparingInt(p -> p.age));
 
// ๋‚˜์ด ๋‚ด๋ฆผ์ฐจ์ˆœ
Arrays.sort(people, (a, b) -> b.age - a.age);
 
// ์ด๋ฆ„ ์‚ฌ์ „์ˆœ
Arrays.sort(people, Comparator.comparing(p -> p.name));

4. ๋ฆฌ์ŠคํŠธ ์ •๋ ฌ

List<Integer> list = new ArrayList<>(Arrays.asList(5,2,9,1));
Collections.sort(list); // ์˜ค๋ฆ„์ฐจ์ˆœ
Collections.sort(list, Collections.reverseOrder()); // ๋‚ด๋ฆผ์ฐจ์ˆœ

โœ… ์ฃผ์š” ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฐœ๋…

1. ์„ ํƒ ์ •๋ ฌ (Selection Sort)

  • ์•„์ด๋””์–ด : ๋งค๋ฒˆ ๊ฐ€์žฅ ์ž‘์€ ๋ฐ์ดํ„ฐ๋ฅผ ์„ ํƒํ•ด์„œ ์•ž์œผ๋กœ ๋ณด๋ƒ„
  • ์‹œ๊ฐ„ ๋ณต์žก๋„ : O(Nยฒ)
for(int i = 0; i < n-1; i++) {
	int minIdx = i;
	for(int j = i+1; j < n; j++) {
		if(arr[j] < arr[minIdx]) {
			minIdx = j;
		}
	}
	
	int tmp = arr[i];
	arr[i] = arr[minIdx];
	arr[minIdx] = tmp;
}

2. ์‚ฝ์ž… ์ •๋ ฌ (Insertion Sort)

  • ์•„์ด๋””์–ด : ์ด๋ฏธ ์ •๋ ฌ๋œ ๊ตฌ๊ฐ„์— ์ƒˆ๋กœ์šด ์›์†Œ๋ฅผ ๋ผ์›Œ ๋„ฃ์Œ
  • ์‹œ๊ฐ„ ๋ณต์žก๋„ : O(Nยฒ), ๊ฑฐ์˜ ์ •๋ ฌ๋œ ์ƒํƒœ๋ฉด ๋น ๋ฆ„.
for(int i = 1; i < n; i++) {
	int key = arr[i];
	j = i-1;
	
	while(j >= 0 && arr[j] > key) {
		arr[j+1] = arr[j];
		j--;
	}
	
	arr[j+1] = key;
}

3. ํ€ต ์ •๋ ฌ (Quick Sort)

  • ์•„์ด๋””์–ด : ํ”ผ๋ฒ—์„ ๊ธฐ์ค€์œผ๋กœ ์ขŒ์šฐ ๋ถ„ํ•  โ†’ ์žฌ๊ท€
  • ์‹œ๊ฐ„ ๋ณต์žก๋„ : ํ‰๊ท  O(N log N), ์ตœ์•… O(Nยฒ)
static void quickSort(int[] arr, int left, int right) {
	if(left >= right) {
		return;
	}
	
	int pivot = arr[(left + right) / 2];
	int i = left;
	int j = right;
	while(i <= j) {
		while(arr[i] < pivot) {
			i++;
		}
		while(arr[j] > pivot) {
			j--;
		}
		if(i <= j) {
			int tmp = arr[i];
			arr[i] = arr[j];
			arr[j] = tmp;
			i++;
			j--;
		}
	}
	quickSort(arr, left, j);
	quickSort(arr, i, right);
}

4. ๋ณ‘ํ•ฉ ์ •๋ ฌ(Merge Sort)

  • ์•„์ด๋””์–ด : ๋ฐฐ์—ด์„ ๋ฐ˜์œผ๋กœ ์ชผ๊ฐœ ์ •๋ ฌ ํ›„ ํ•ฉ์นจ
  • ์‹œ๊ฐ„ ๋ณต์žก๋„ : O(N log N)
static void mergeSort(int[] arr, int left, int right) {
	if(left >= right) {
		return;
	}
	
	int mid = (left + right) / 2;
	mergeSort(arr, left, mid);
	mergeSort(arr, mid+1, right);
	merge(arr, left, mid, right);
}

โ“ ์ •๋ ฌ ํ™œ์šฉ

(A) ์—ฌ๋Ÿฌ ๊ธฐ์ค€ ์ •๋ ฌ

// ๊ตญ์–ด ์ ์ˆ˜ ๋‚ด๋ฆผ์ฐจ์ˆœ, ๊ฐ™์œผ๋ฉด ์˜์–ด ์ ์ˆ˜ ์˜ค๋ฆ„์ฐจ์ˆœ
Arrays.sort(students, (a, b) -> {
	if(a.korean != b.korean) {
		return b.korean - a.korean;
	}
	return a.english - b.english;
});

(B) ์ •๋ ฌ ํ›„ ์Šค์œ„ํ•‘

  • ๊ตฌ๊ฐ„ ๊ฒน์นจ ์ฒดํฌ, ์ตœ๋Œ€ ๋™์‹œ ์ง„ํ–‰ โ†’ ์ •๋ ฌ ํ›„ ํ•œ๋ฒˆ ํ›‘๊ธฐ.

(C) ์ •๋ ฌ + ํˆฌ ํฌ์ธํ„ฐ

  • ๋‘ ๋ฐฐ์—ด ํ•ฉ, ์ฐจ์ด ์ตœ์†Œ, ํŠน์ • ํ•ฉ ์ฐพ๊ธฐ

(D) ์ •๋ ฌ + ์ด์ง„ํƒ์ƒ‰

  • ๋ฐ์ดํ„ฐ ์ •๋ ฌ โ†’ Arrays.binarySearch ๋˜๋Š” ์ง์ ‘ ๊ตฌํ˜„