์ ๋ ฌ (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 ๋๋ ์ง์ ๊ตฌํ