javascript 사전

sort

요약(Summary)

배열을 정렬한다.

문법(Syntax)

array.sort(sortfunc)

인자(Parameters)

인자명 데이터형 필수/옵션 설명
sortfunc function 옵션 원소들 간에 무엇이 우선인지를 판단한다

반환값(Return)

array, 정렬된 배열, 자기 자신에 대한 레퍼런스 값 임

설명(Description)

배열을 정렬한다.
알파벳 순서로 정렬한다.
숫자의 경우 암시적으로 문자열로 형변환 하기 때문에 숫자 1이 숫자 10보다 먼저 나온다. (예제 참고)
sortfunc 로 비교 대상인 두개의 인자를 전달하는데, 리턴 값에 따라서 선후를 판단한다. (예제 참고)

예제(Example)

var numbers = [9,8,7,6,5,4,3,2,1];
alert(numbers.sort()); // array, [1,2,3,4,5,6,7,8,9]
alert(numbers); // array, [1,2,3,4,5,6,7,8,9], 원본을 변경한다. 
alert(numbers.sort() === numbers); // boolean, true, 원본과 반환값이 같다.

var numbers = [20, 10, 9,8,7,6,5,4,3,2,1];
//array, [1,10,2,20,3,4,5,6,7,8,9], 암시적으로 원소를 문자로 형변환 하기 때문에 10이 1뒤에 온다.
alert(numbers.sort()); 
function sortNumber(a,b){
    // 비교 대상인 a와 b가 인자로 전달된다.
    //alert('a :'+a+', b:'+b);
    // a에서 b를 뺀 결과가 음수면 a가 b보다 작고, 0이면 같다.
    // sort메소드는 return 값이 음수,양수,0인지에 따라서 순서를 정한다.
    return a-b;
}
var numbers = [20, 10, 9,8,7,6,5,4,3,2,1];
alert(numbers.sort(sortNumber)); // array, [1,2,3,4,5,6,7,8,9,10,20]

function sortNumber(a,b){
    // 위의 예제와 비교해서 a와 b의 순서를 바꾸면 정렬순서가 반대가 된다.
    return b-a;
}
var numbers = [20, 10, 9,8,7,6,5,4,3,2,1];
alert(numbers.sort(sortNumber)); // array, [20,10,9,8,7,6,5,4,3,2,1]

참고

 

댓글

댓글 본문
작성자
비밀번호
  1. 지나가다가
    구체적인 정렬 알고리즘은 프로그래밍 초심자가 이해하기 어려워서
    이고잉님께서 일부러 설명을 스킵하신 것 같은데...
    밑에 잘못된 정보가 있어 제가 굳이 설명을 보탭니다.

    우선 [20, 10, 9,8,7,6,5,4,3,2,1]의 배열에서 a-b라는 연산을 모두 한 다음
    그 결과값으로 정렬하는 것이 결코 아닙니다.
    뭐하러 굳이 뺄셈을 하고 그 값으로 또 정렬하겠습니까?

    자바스크립트의 정확한 알고리즘은 아니지만
    쉽게 정렬 알고리즘을 설명하면 이렇습니다.

    (a,b) 형식으로 지정한 두 인자를 차례로 비교합니다.

    우선 배열 numbers[0]과 numbers[1] 즉, 20과 10을 비교해 볼까요?
    20-10 = 10
    결과값이 10 즉, 양수입니다.
    sort함수에 sortNumber(a,b)의 return 값으로 양수 10을 전달합니다.
    그럼 sort함수가 양수값을 전달받고 배열의 순서를 바꾸어 버립니다.
    (정확하게 말하면 두 배열 안에 든 값을 교체)
    그럼 배열이 [10, 20, 9,8,7,6,5,4,3,2,1] 이렇게 바뀝니다.

    그 다음 numbers[0]과 numbers[2] 즉 10과 9를 비교합니다. 10 - 9 = 1 >0, 양수입니다.
    결과값이 양수이므로 또 10과 9의 순서를 바꿉니다.
    이런 식으로 계속 두 인자를 비교해서 결과값이 양수가 나오면 순서를 바꾸고,
    음수가 나오면 순서를 그대로 유지하는 겁니다.

    배열이 바뀌어가는 순서를 보면 이해하기 쉽습니다.

    [(20), (10), 9,8,7,6,5,4,3,2,1] 20-10 = 10, 즉 양수이므로 순서바뀜! ()는 비교되는 인자값.
    [(10), 20, (9),8,7,6,5,4,3,2,1] 10 - 9 = 1 또 양수, 순서 바뀜.
    [(9), 20, 10, (8),7,6,5,4,3,2,1] 반복...
    [(8), 20, 10, 9,(7)...]
    ...
    [(2). 20, 10...3, (1)]
    [(1), 20, 10...]

    그럼 배열 내에서 가장 작은 값 1이 찾아지겠죠.

    [1, 20, 10, 9,8,7,6,5,4,3,2]

    1의 순서는 바뀌지 않습니다. 1-2 = -1
    즉 결과값이 음수이기 때문이죠.

    그 다음은 두번째 배열 차례입니다.
    20 - 10 = 10 > 0 이므로 순서를 또 바꿉니다.

    [1, (20), (10), 9,8,7,6,5,4,3,2]
    [1, (10), 20, (9), 8...]
    [1, (9), 20, 10, (8)...]

    이런 식으로 반복하다 보면 두번째로 작은 값 2도 찾게 됩니다.

    ....
    [1, 2, 20, 10, 9,8,7,6,5,4,3]

    그럼 다음은 세번째...
    이렇게 지루하게 반복하면 결국 정렬이 됩니다.

    물론 실제 자바스크립트에서는 비교하는 순서가 다릅니다.
    다른 알고리즘을 쓰기 때문이죠.

    이렇게 차례차례 비교해 나가면 인간이 이해하기는 쉽지만
    연산량이 기하급수적으로 늘어나기 때문에 다른 정렬 알고리즘을 쓰는 것이죠.

    실제로는
    [20, 10, 9,8,7,6,5,4,3,2,1]
    배열의 양쪽 끝부터 비교하고 (20, 1),
    그 다음 배열의 가운데 값을 차례로 비교해 나갑니다. (1,6)
    디버깅해 보시면 쉽게 아실 수 있을 겁니다
  2. Dong Il Kim
    여기 글을 잘 보시면 sort()는 '원소들 간에 무엇이 우선인지를 판단한다'라고 되어 있습니다. 우선순위를 판단해서 순서를 반환하는거지 각각의 값을 반환하는게 아니겠죠. 1, 20, 2, 20 이 아니라 1, 2, 20이 되겠죠.
    대화보기
    • 제이슨고
      이해가 잘 안되서 그런데요, 모든 값들끼리 a-b를 해서 나온 값을 sort 하면 -19, -18, -17, ... , 17, 18, 19 이렇게 순서가 되는데요, 그 다음 처리가 이해가 잘 안가요~ -19(1-20)이니까 1과 20은 1, 20 순서로 sort 되고 -18(2-20)이니까 2,20순서로 sort 되면 1, 20, 2, 20 이렇게 되는거 아닌가요?? sort 할 때에는 a 값만 살리는지?? 이 부분이 이해가 잘 안됩니다. 1은 항상 20보다 앞이다. 2는 항상 20보다 앞이다. 그리고 1과 2인 경우에는 1이 항상 2보다 앞이다.. 이런식으로 해서 정렬이 된다는 건지요??
      대화보기
      • Dong Il Kim
        var numbers = [20, 10, 9,8,7,6,5,4,3,2,1];
        function sortNumber(a,b){
        return a - b;
        }
        를 하게 되면 모든 값들끼리 a - b를 하게 됩니다.

        그렇게 나온 값들을 sort()에 넣으면, (a - b)의 순서가 숫자가 낮은 것부터 높은 순서대로 정렬이 되겠죠.
        -19(1 - 20), -9(1-10), -8(1-9), -7(1-8), -6(1-7), -5(1-6), -4(1-5), -3(1-4), -2(1-3), -1(1-2)
        -18(2-20), -8(2-10), -7(2-9), -6(2-8), -5(2-7), -4(2-6), -3(2-5), -2(2-4), -1(2-3), 0(2-2), 1(2-1)
        -17(3-20), -7(3-10), -6(3-9), -5(3-8), -4(3-7), -3(3-6), -2(3-5), -1(3-4), 0(3-3), 1(3-2), 2(3-1)
        ...
        10(20-10), 11(20-9), 12(20-8), 13(20-7), 14(20-6), 15(20-5), 16(20-4), 17(20-3), 18(20-2), 19(20-1)

        그럼 계산된 숫자의 크기에 따라서 a와 b의 순서가 sort()에 의해 재배열 되어
        1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20
        가 나옵니다.
        대화보기
        • 박철오
          잘모르겟다 설명좀 해주세요
        • Joon Seo An
          감사합니다.
        • 나무마루
          lert 는 뭔가요?
        graphittie 자세히 보기