알고리즘

[JAVA/PYTHON/JAVASCRIPT] 정렬

NickTop 2023. 6. 20. 01:03

구현방법 다르지만 비슷하다

1. 기본 오름차순 정렬

2. 문자 정렬은 아스키코드 기준

3. comparator 함수 구현 가능

 

Comparator

function(a,b) returns [positive,0,negative]

comparator 함수 결과가 양수면 오른쪽 값, 음수면 왼쪽 값이 크다는 의미

0이면 대소비교할 수 없음

 

JAVA(ArrayList)

import java.util.*;

public class MyClass {
    public static void main(String args[]) {
      ArrayList<String> list = new ArrayList<String>();
      list.add("한국어");
      list.add("english");
      list.add("12number");
      list.add("0foo1");
     
      // 오름차순 정렬
      Collections.sort(list);
      System.out.println(list);
      // [0foo1, 12number, english, 한국어]
      
      // 내림차순
      Collections.sort(list, Collections.reverseOrder());
      System.out.println(list);
      // [한국어, english, 12number, 0foo1]
      
      // 사용자 정의 함수
      Collections.sort(list, (o1,o2)->o1.length()-o2.length());
      System.out.println(list); // [한국어, 0foo1, english, 12number]
    }
}

 

JAVA(Array)

import java.util.*;

public class MyClass {
    public static void main(String args[]) {
       String[] array = {"한국어", "english", "12number", "0foo1"};
       
       // 오름차순 정렬
       Arrays.sort(array);
       System.out.println(Arrays.toString(array));
       // [0foo1, 12number, english, 한국어]
       
       // 내림차순
       Arrays.sort(array, Collections.reverseOrder());
       System.out.println(Arrays.toString(array));
       // [한국어, english, 12number, 0foo1]
       
       // 사용자 정의 함수
       Arrays.sort(array, (o1,o2)->o1.length()-o2.length());
       System.out.println(Arrays.toString(array));
       // [한국어, 0foo1, english, 12number]
    }
}

 

JAVASCRIPT

let array = ["한국어", "english", "12number", "0foo1"]

// 오름차순 정렬
array.sort();
console.log(array);
// [0foo1, 12number, english, 한국어]

// 내림차순 정렬
array.reverse(); // reverse sort 기본 내장함수 없음, 오름차순 정렬하고 뒤집어야함
console.log(array);
// [한국어, english, 12number, 0foo1]

array.sort((o1,o2)=>o1.length-o2.length);
console.log(array);
// [한국어, 0foo1, english, 12number]


// 숫자 정렬 시
const arr = [1, 10, 2, 7, 23];
arr.sort();
console.log(arr);
// [ 1, 10, 2, 23, 7 ]
arr.sort((o1,o2)=>o1-o2);
console.log(arr);
// [ 1, 2, 7, 10, 23 ]

javascript는 정렬 시 숫자로 지정해도 문자 기준으로 정렬하기 때문에 주의

 

PYTHON

array = ["한국어", "english", "12number", "0foo1"]
# 오름차순 정렬
array.sort()
print(array)
# ['0foo1', '12number', 'english', '한국어']

# 내림차순 정렬
array.sort(reverse=True)
print(array)
# ['한국어', 'english', '12number', '0foo1']

# 사용자 지정
array.sort(key=lambda o:len(o))
# len(o) 기준으로 정렬한다는 뜻
# ["한국어", "english", "12number", "0foo1"] => [3,7,8,4] 로 변환해서 정렬 수행
print(array)
# ['한국어', '0foo1', 'english', '12number']

# 사용자 지정2
array = [[2,"한국어"], [1,"english"], [1,"12number"], [2,"0foo1"]]
array.sort(key=lambda o:(-o[0],o[1]))
# return을 tuple로 준다면...
# 첫번째 값 -o[0]으로 먼저 정렬하고 두번째 값 o[1] 로 정렬함
print(array)
# [[2, '0foo1'], [2, '한국어'], [1, '12number'], [1, 'english']]

# 사용자 지정3 e.g) 첫번째 요소로 오름차순 정렬, 두번째 요소로 내림차순 정렬
# array.sort(key=lambda o:(o[0],-o[1])) => 이건 str이 음수가 될 수 없기 때문에 안됨
import functools
def compare(o1, o2):
    if o1[0]!=o2[0]:
        return o1[0]-o2[0]
    if o2[1] == o1[1]:
        return 0
    return 1 if o2[1] > o1[1] else -1
array.sort(key=functools.cmp_to_key(compare))
print(array)
# [[1, 'english'], [1, '12number'], [2, '한국어'], [2, '0foo1']]