lua 정렬 함수 (table. sort) 오류 분석 - 정렬 을 위 한 잘못된 order 함수

2992 단어 lua
글 목록
  • table. sort 개술
  • table. sort 소스 코드 및 주석
  • invalid order function for sorting 오류 의 원인 및 해결 방법
  • 개인 적 으로 비교적 좋다 고 생각 하 는 lua 정렬 함수 표기 법
  • table. sort 개요
  • table. sort 함수 의 본질은 빠 른 배열 알고리즘 이 고 이 를 바탕 으로 세 가지 최적화
  • 를 했다.
  • 매번 분할 배열 의 닻 점 은 현재 분할 배열 의 초기 점, 중간 점, 끝 점 에서 중위 수 를 닻 점 으로 선택 하고 극단 적 인 상황 에서 빠 른 배열 의 횟수 를 줄 이 는 것 이다. 매번 분할 배열 의 닻 점 은 현재 분할 배열 의 초기 점, 중간 점, 끝 점 에서 중위 수 를 닻 점 으로 선택 하여 극단 적 인 상황 에서 빠 른 배열 의 횟수
  • 를 줄인다.
  • 교체 함수 중의 분할 배열 의 길 이 는 3 보다 적 고 크기 교환 위 치 를 직접 비교 하여 질서 있 는 배열 을 형성 하 는 목적 은 재 귀 호출 의 깊이
  • 를 줄 이 는 것 이다.
  • 매번 에 닻 점 을 통 해 분할 배열 을 반 으로 나 눈 후에 길이 가 비교적 작은 반 을 재 귀적 으로 호출 하고 나머지 반 은 While 을 통 해 계속 분할 처 리 를 하 는데 목적 도 재 귀적 호출 의 깊이 를 줄 이 는 것 이다
  • .
    table. sort 소스 코드 및 주석
        static void auxsort (lua_State *L, int l, int u) {
          while (l < u) {  /* for tail recursion */
            int i, j;
            /* sort elements a[l], a[(l+u)/2] and a[u] */
            lua_rawgeti(L, 1, l);
            lua_rawgeti(L, 1, u);
            if (sort_comp(L, -1, -2))  /* a[u] < a[l]? */
              set2(L, l, u);  /* swap a[l] - a[u] */
            else
              lua_pop(L, 2);
            if (u-l == 1) break;  /* only 2 elements */
            i = (l+u)/2;
            lua_rawgeti(L, 1, i);
            lua_rawgeti(L, 1, l);
            if (sort_comp(L, -2, -1))  /* a[i]= P */
    while (lua_rawgeti(L, 1, ++i), sort_comp(L, -1, -2)) {
    if (i>u) luaL_error(L, "invalid order function for sorting");
    lua_pop(L, 1);  /* remove a[i] */
    }
    /* repeat --j until a[j] <= P */
    while (lua_rawgeti(L, 1, --j), sort_comp(L, -3, -1)) {
    if (j

    invalid order function for sorting 오류 의 원인 및 해결 방법
         while (lua_rawgeti(L, 1, ++i), sort_comp(L, -1, -2)) {
             if (i>u) luaL_error(L, "invalid order function for sorting");
             lua_pop(L, 1);  /* remove a[i] */
         }
         /* repeat --j until a[j] <= P */
         while (lua_rawgeti(L, 1, --j), sort_comp(L, -3, -1)) {
           if (j

    원본 코드 에서 잘못된 위 치 를 볼 수 있 습 니 다.닻 점 의 값 이 경계 값 과 같 을 때 정렬 방법 sortcop 가 true 로 돌아 가면 배열 이 경 계 를 넘 을 수 있 고 해결 방안 도 간단 합 니 다. 비교 한 두 값 이 같 을 때 false 로 돌아 가면 됩 니 다.
    개인 적 으로 좋 은 lua 정렬 함수 쓰기
    전투력 랭 킹 에 전투력 이 있다 고 가정 하면 레벨 두 개의 정렬 인자 가 있 습 니 다. 먼저 전투력 에 따라 높 은 것 에서 낮은 것 으로 배열 한 다음 에 레벨 에 따라 높 은 것 에서 낮은 것 으로 배열 해 야 합 니 다. 그러면 정렬 함 수 는 이렇게 쓸 수 있 습 니 다.
        table.sort(     , function(a, b)
            if a.   ~= b.   then
                return a.   > b.  
            end
            if a.   ~= b.   then
                return a.   > b.  
            end
            return false
        end)
    

    ps: 위 에서 언급 한 lua 버 전 은 5.1 입 니 다.

    좋은 웹페이지 즐겨찾기