LlListSort/ko
명세
본 함수는 거품 정렬(bubble sort)로 구현되어있다.
정렬 순서는 유형의 영향을 받는다.
각각의 유형은 제각기 따로 정렬되며 다른 유형들에 대한 상대적인 위치는 변하지 않는다.
<lsl>llListSort([1, "C", 3, "A", 2, "B"], 1, TRUE)은 [1, "A", 2, "B", 3, "C"]를 반환
llListSort([1, 3, 2, "C", "A", "B"], 1, TRUE)은 [1, 2, 3, "A", "B", "C"]를 반환
llListSort([1, "C", 3, "A", 2, "B"], 2, TRUE)은 [1, "C", 2, "B", 3, "A"]를 반환</lsl>
주의
예제
<lsl> list numbers = [3, "three", 2, "two", 1, "one"]; default {
state_entry() { llOwnerSay(llDumpList2String(numbers, ",")); // Object: 3,three,2,two,1,one numbers = llListSort(numbers, 2, TRUE); llOwnerSay(llDumpList2String(numbers, ",")); // Object: 1,one,2,two,3,three }
} </lsl>
기록
자료형
llListSort는 같은 자료형의 항목들에 대해서만 작동된다. 여러가지 유형으로 된 목록에 대해서도 물론 작동을 하겠지만 그 결과는 대체로 무의미할 것이다.
<lsl>list mylist = ["brown", <0.000000, 0.000000, 0.000000>, "house", 17.005, 100, "cat", <3.000000, 3.000000, 3.000000>, 39]; list tmplist = llListSort(mylist,1,TRUE); llSay(0, llList2CSV(tmplist));</lsl>
이것은 다음을 출력한다:
brown, <0.000000, 0.000000, 0.000000>, cat, 17.004999, 39, house, <3.000000, 3.000000, 3.000000>, 100
결과의 활용
원본 목록은 변하지 않는다는 것에 주의해야 한다. 그 대신, 새로운 정렬된 목록이 생성되는 것이다. 따라서 (결과를 바로 사용하지 않는다면) 이것을 또 하나의 변수로 담는 것이 중요하다.
<lsl>llListSort(myList,1,TRUE); //cpu를 낭비한 셈이며 실제로 아무런 결과도 저장하지 못한다. list newlist = llListSort(myList,1,TRUE);//결과물을 저장하였다. llSay(0,llList2CSV(llSortList(myList,1,TRUE)));//이 경우는 결과를 담아둘 필요가 없다. 결과를 바로 이용하고 있다.</lsl>
Stride 매개변수
대부분은 모든 항목을 가지고 정렬하기 위해 "integer stride"를 1(혹은 0도 작동한다)로 놓게 될 것이다. (절편 목록을 다룰 것이라면 절편 목록의 정렬를 자세히 다룬 절을 자세히 볼 것.)
정렬 순서
매개변수 "integer ascending"를 TRUE로 놓으면 오름차순으로 정렬된다.
예: ["Apples", "Bananas", "Oranges"]
매개변수 "integer ascending"를 FALSE로 놓으면 내림차순으로 정렬된다.
예: ["Oranges", "Bananas", "Apples"]
절편 목록의 정렬
관계 있는 자료끼리 묶음으로 처리하기 위해 절편 목록을 사용할 때에 항목들을 모두 제각기 정렬해버린다면 재앙을 초래할 것이다.
<lsl>list demographics = ["John Adams", "male", "2007-06-22", "Shirley Bassey", "female", "2005-11-02", "Matt Damon", "male", "2008-05-19"];</lsl>
나쁜 예
<lsl>list tmplist_1 = llListSort(demographics, 1, TRUE); //tmplist_1 == ["2005-11-02", "2007-06-22", "2008-05-19", "John Adams", "Matt Damon", // "Shirley Bassey", "female", "male", "male"] //절편은 파괴되고 정렬된 자료들은 무의미해진다.</lsl>
좋은 예
대신, 묶음(소위 "절편")으로 된 자료들을 다루기 위해서는 다음과 같이 해야 한다:
<lsl>list tmplist_2 = llListSort(demographics,3,TRUE); //templist_2 = ["John Adams", "male", "2007-06-22", "Matt Damon", "male", "2008-05-19", // "Shirley Bassey", "female", "2005-11-02"] </lsl>
자료들을 절편 목록에 저장할 때는 어떻게 정렬하는 것이 가장 바람직한지, 심지어 그런 방식을 쓰는 것이 과연 필요한지 부터 살피는 것이 좋다. 해당 묶음의 첫 번째 원소들을 가지고만 정렬할 수 있음을 기억하라. 그러므로 (위의 예제에서 그랬듯이) 성별을 기준으로 우선 정렬을 하고 싶다면, 성별을 각각의 묶음에서 첫 번째 원소가 되게 하면 된다.
상세 기록
쟁점
SVC-2988 | Change llListSort to use a faster algorithm |
출처
lsa_bubble_sort(): 'linden\indra\lscript\lscript_alloc.h'