2009-08-25 5 views
1

Delphi에서 배열을 정렬하는 가장 좋은 방법은 "영숫자"입니까? 델파이 배열 요소는 영숫자 정렬 순서입니까?

나는

"이 배열의 요소는 숫자 정렬 순서 오름차순에 있어야합니다."내 응용 프로그램의 이전 코드에서이 댓글을 발견

그렇다면 그 이유는 무엇입니까?

-Vas

+0

질문을 수정하십시오. 일반적으로 (첫 번째 문장) 또는 특히 응용 프로그램 정렬에 대해 묻고 있습니까? 후자의 경우 응용 프로그램은 배열에서 무엇을합니까? 아마도 이것을 두 가지 이상의 질문으로 나눌 필요가있을 것입니다. – Argalatyr

+0

나는 일반적으로 정렬하는 것에 대해 이야기하고 있습니다. – vas

답변

5

배열의 요소 (또는 그 사실에 대한 수집)을 분류하는 방법에 대한 더 "최고"방법이 없습니다. 정렬은 인간화 된 특성 (일들은 일반적으로 정렬되지 않음)입니다. 그래서 주석이 프로그램이 기대하는 것과 더 관련이 있다고 생각합니다.

더 구체적으로 배열 요소가 영숫자로 정렬되기를 기대하는 다른 코드 섹션이있을 수 있습니다. 이미 호출 된 코드가 배열을 먼저 정렬 할 필요가 없도록 이미 정렬 된 TreeView에 표시하는 것처럼 간단 할 수 있습니다.

배열은 인접한 메모리 할당으로 표시되므로 액세스가 빠릅니다. 내부적으로 컴파일러는 GetMem을 호출하여 SizeOf (Type) * 배열 크기를 요청합니다. 일반적으로 배열의 성능이나 메모리 크기에 영향을주는 요소 정렬 방식에는 아무 것도 없습니다. 프로그램 논리에 있어야합니다.

+0

내가 언급 한이 커넷은 코드 전체에 "영숫자"가 사용 된 모든 배열 앞에 놓였습니다. – vas

+0

항상 특별한 이유가 없습니다. 정렬에는 항상 시간이 걸리고, 뭔가가 당신의 퍼포먼스에 부딪혔을 때, 특별히 뭔가를 정렬한다면 그럴 필요는 없습니다. –

2

아니요, 정렬에 "최선의 방법"이 없습니다. 그리고 이것이 여러 분류 기술이있는 이유 중 하나입니다.
QuickSort를 사용하면 궁극적으로 원하는 순서를 결정할 때 비교 기능을 제공 할 수도 있습니다.

+2

가장 일반적인 정렬 방법은 없지만 사실 QuickSort는 평균적인 경우 (그리고 대부분의 실제 경우) 컬렉션을 정렬하는 가장 좋은 방법이며 수학적으로 증명되었습니다. 최고 최악의 경우 성능을 제공하거나 "안정적인 정렬"을 제공하는 다른 정렬 방법이 있지만 일반적으로 빠른 정렬은 실제로 최고의 정렬 알고리즘입니다 (양자 컴퓨팅 및 모든 것을 제외하고) –

+0

내 포인트는 QuickSort로 제공해야합니다. 필요에 따라 항목 A를 항목 B 앞에 놓는 규칙. –

1

배열을 어떤 방식으로 정렬하는 것은 배열에서 이진 검색을 수행 할 때 유용합니다. 이진 검색은 다른 방법에 비해 매우 빠릅니다. 그러나 정렬 오류가 잘못되면 검색에서 레코드를 찾을 수 없습니다. 배열을 정렬 된 상태로 유지해야하는 다른 이유는 거의 항상 외관상의 이유 때문에 배열이 어떤 출력으로 보내지는 방법을 결정하기위한 것입니다.

배열을 재정렬하는 가장 좋은 방법은 배열의 길이와 배열의 길이에 따라 다릅니다. QuickSort 알고리즘은 대부분의 경우에 빠른 결과를 제공합니다. 델파이는 문자열리스트와 다른리스트를 가지고 작업 할 때 그것을 내부적으로 사용합니다. 질문은, 당신이 정말로 그것을 정렬해야합니까? 실제로 배열을 유지해야합니까?

그러나 배열을 정렬 된 상태로 유지하는 가장 좋은 방법은 추가 한 첫 번째 요소부터 정렬하여 유지하는 것입니다! 일반적으로 배열 형식을 유지하는 데 도움이되는 배열 형식 주위에 래퍼를 작성합니다. 'Add'메서드는 배열에서 추가하려는 값보다 작거나 같은 가장 큰 값을 검색합니다. 그런 다음 해당 위치 바로 다음에 새 항목을 삽입합니다. 나에게 그것은 최고의 해결책이 될 것이다. (큰 배열을 사용하면 이진 검색 방법을 다시 사용하여 새 레코드를 삽입해야하는 위치를 찾을 수 있습니다. 끝에 레코드를 추가하는 것보다 속도가 느리지 만 정렬되어 있는지 여부는 궁금하지 않아도됩니다.

3

대부분의 경우 검색 시간을 단축하기 위해 배열이 정렬됩니다. 길이 L 목록이 주어지면 중간 점 (L DIV 2)과 비교하여 더 큰 반쪽을보아야하는지 빠르게 결정합니다. 덜 절반, 그리고 반복적으로이 패턴을 사용하여 나눌 때까지 또는 내 성냥을 찾을 때까지이 패턴을 계속 사용합니다. 이진 검색이라고합니다. 목록이 정렬되지 않으면이 유형의 작업을 사용할 수 없으며 대신 내가 끝날 때까지 목록의 모든 항목을 검사해야합니다.