문제

힙 목록에는 다음이 적용됩니다.

l[i] <= l[2*i] && l[i] <= [2*i+1]

0 <= i < len(list)

내가 찾는 장소에서 분류를 제공합니다.

도움이 되었습니까?

해결책

잘 당신이 절반 방법을 통해 힙 정직함으로써,귀하의 데이터 힙.당신은 단지 구현이 필요 두 번째 부분의 힙 정렬 알고리즘이 있습니다.이보다 더 빨리해야 사용하는 퀵 힙에 배열입니다.

를 느끼는 경우에 용감한 있을 수 있습에 가 구현하는 smoothsort, 는 것보다 빠른 힙 정렬을 위해 거의 정렬 데이터입니다.

다른 팁

사용 힙합니다.그것은에 있습니다.는 것이 가장 선택해야 하는 것입니다.

할 수 있습뿐만 아니라 단지 사용의 힙으로 분류해 몇 가지 다른 알고리즘이 있습니다.나중에 다시 빌드의 힙에서 정렬된 목록입니다.퀵 좋은 후보는 확신할 수 있기 때문에 그것을 실행되지 않습에서 최악의 경우 O(n2)기 때문에 단순히 당신의 힙 이미 미리 정렬됩니다.

할 수 있는 더 빠른 경우 비교-기능이 비싸다.힙 종류를 평가하려는 경향이 있을 비교-기능이 아주 많습니다.

분류 힙 장소에서 같은 소리의 종류에 대한 작업 힙 정렬.

나는 가정에 메모리가 제한되어 있는 임베디드 앱도 있나?

이미 있기 때문에 힙,수 없었 당신은 단지 사용의 두 번째 단계 힙 정렬?그것은 작동에 위치하고 있어야 좋고 효율적입니다.

에 대한 정렬,가장 빠른 방법은 다음과 같습니다.주의에 의해 하나에 오류가 나의 코드입니다.이 방법을 제공합 반대로 정렬된 목록을 해야 하는 취소 하기 어렵에서 최종 단계입니다.사용하는 경우에는 최대한 힙,이 문제가 사라집니다.

일반적인 아이디어가 깔끔한 하나:스왑은 가장 작은 소자(인덱스 0)마지막 요소에 힙,거품는 요소를 때까지 아래로 힙 숙박 시설은 복원,수축 크기의 힙 중 하나에 의해하고 반복합니다.

이것은 절대 가장 빠른 방법으로 비치 정렬 데이비드 맥케이 보여 줍 -당신이 할 수 있는 더 넣어 요소가 될 가능성이 더 높은 가장 작은 상단에서의 힙 대신에 하나의 바닥에서 행이 있습니다.

시간 복잡 T(n.로그 n)최악의 경우-n 과 반복 가능하게 로그 n(높이의 힙)를 통하는 동안 반복입니다.

for (int k=len(l)-1;k>0;k--){
swap( l, 0, k );
while (i*2 < k)
  {
int left = i*2;
int right = l*2 + 1;
int swapidx = i;
if ( l[left] < l[right] )
  {
    if (l[i] > l[left])
      {
    swapidx = left;
      }
  }
else
  {
    if (l[i] > l[right])
      {
    swapidx = right;
      }
  }

if (swapidx == i)
  {
    // Found right place in the heap, break.
    break;
  }
swap( l, i, swapidx );
i = swapidx;
  }}

// Now reverse the list in linear time:
int s = 0; 
int e = len(l)-1;
while (e > s)
  {
    swap( l, s, e );
    s++; e--:
  }

항목을 읽기의 힙 중 하나에 의해 하나입니다.기본적으로 무엇이 있음은 힙합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top