2009-09-09 5 views
0

내가 원했던 것은 텍스트 식별자 목록을 정렬하는 것입니다 (예를 들어 파일 이름을 생각해보십시오). 내가 찾고있는 정렬 알고리즘은 일종의 알파벳 정렬이지만 그룹을 고려합니다. "D21"를 "D1"을 선별 예알파벳순으로 정렬하지만 그룹이나 기호를 존중하는 방법은 무엇입니까?

가 같아야

D1, D2, D3, ..., D21

그리고 여부 :

D1, D10, D11, D12, D20, D21, D3, ...

나는 이러한 정렬 방법을 수행하기 위해 많은 시간을 보냈지 만 여전히 그것을 수행하는 방법을 찾을 수 없다. 그룹이 클수록 어려워집니다.

어떤 언어로 된 의사 코드 나 코드를 안내 할 수있는 사람이 있습니까?

감사합니다.

답변

3
  • 문자열이 먼저 다른 위치를 찾습니다.
  • 그 위치에서 두 값이 모두 숫자 인 경우 : 당신이 중 하나를 문자열이 아닌 숫자를 찾을 때까지
    • 는, 앞으로 읽을 한 문자에서 한 번에. 하나의 문자열이 숫자가 아닌 경우
    • , 그것은 두 문자열이 같은 점에서 숫자가 아닌 경우 "작은"
    • 은 이전 검출 된 위치
  • 그렇지 않으면
      에서 숫자를 비교하다
+0

감사합니다. 그것은 쉽고 나는 그것을 만들기 위해 많은 시간을 보냈습니다. – Shantia

+0

메모리 사용량이 조금 더 가볍게 업데이트되었으므로 저장 또는 캡처 할 필요가 없습니다. – gnarf

1

유닉스 정렬 유틸리티에는 일반 사전 정렬 대신 원하는 방식으로 정렬하는 '숫자 정렬'옵션 -n이 있습니다.

은 어쩌면 '숫자 정렬'

종류의 유닉스 소스 코드를 사용할 수 있지만, 따라하기 아마도 어려울 것에 대한 정보를 찾습니다.

2

제프는이있는 위치에 알파벳 문자를 비교 여러 구현에 대한 링크가있는 10 "자연 분류"라고 불리는 것 같습니다.

도 참조하십시오. this question

1

PHP : 함수의 nat*sort 가족 (natsort, natcasesort, ...)

펄 :

당신이 자연 종류라고 찾고있는 무엇
sub natcmp { 
    # from http://www.perlmonks.org/?node_id=540890 
    my @a = split /(\d+)/, (shift or $a); 
    my @b = split /(\d+)/, (shift or $b); 

    my $last = min(scalar @a, scalar @b)-1; 
    my $cmp; 
    for my $i (0 .. $last) { 
     unless($i & 1) { # even 
      $cmp = lc $a[$i] cmp lc $b[$i] || $a[$i] cmp $b[$i] and return $cmp; 
     } else { # odd 
      $cmp = $a[$i] <=> $b[$i] and return $cmp; 
     } 
    } 
    return scalar @a <=> scalar @b; # shortest array comes first 
} 

# ... 

@sorted_array = sort natcmp @array; 

.

1

다른 사람들은 "자연 정렬"이라고 지적했습니다.코드의 경우 this Python implementation이 내가 찾은 것 중 가장 간단합니다. 기본적으로 정규 표현식을 사용하여 각 문자열을 int 또는 문자열의 이기종 목록으로 분리 한 다음 비교합니다.

이것은 몇 가지 파이썬 기능 w.r.t를 활용합니다. 개체 비교. 첫째, int와 문자열을 직접 비교할 수 있습니다 (ints는 다른 문자열과 비교하여 정렬). 둘째, 이기종 목록을 비교할 수 있습니다 (요소를 처음부터 비교하여 차이를 찾을 때까지 비교 함).

관련 문제