의 비 재귀 알고리즘 병합 정렬

원본 링크 : http://www.cnblogs.com/arcfat/archive/2012/12/06/2805701.html

8645 병합 정렬 (비 재귀 알고리즘)

시간 제한 : 1000MS 메모리 제한 : 1000K

질문 : 프로그래밍 언어 제목 : 무제한

 

기술

달성 결과 함수가 (비 재귀 알고리즘) 정렬 병합하고 여행 당 분류에 출력

 

입력

첫번째 라인 : 키보드 입력 키의 수 n 소트 
번째 행 : n 번째의 입력 키를 정렬하는 공간에 의해 분리 된 데이터를

산출

데이터 사이의 공간에 의해 분리 된 당 트립 정렬 출력 결과의 각 행,

 

샘플 입력

10 
5 9 4 8 0 3 2 6 7 1

 

샘플 출력

4 5 0 8 3 9 2-6 1-7 
0-4 5-8 2 3 9 6 1 7 
0 2 3 4 5 6 7 8 9 1 
0 1 2 3 4 5 6 7 8 9

 

// 다음은 코드 AC입니다

사용법 #include <iostream>
네임 스페이스를 사용하여 표준;

프로세스 공간 (N-INT)
보이드 머지 소트 (오라이 INT [], INT N-)
보이드 newMerge (오라이 INT [], INT tmpArray [], INT의 S, N-INT); // 함수와 병합 완료 시간이 없다 두 정렬 된 배열 인접 병합
공극 병합 ([] 오라이 값 int //; INT tmpArray [], 좌측 INT, INT 미드 int로 오른쪽) 배열의 두 행은 tmpArray로 분류되어 병합
공극 출력 ( INT 연산 [], INT 않음) //; 출력 어레이

INT의 main ()
{
  INT 않음;
  CIN >> N;
  공정 (N);
  0을 반환;
}

프로세스 공간 (N-int)를
{
  [. N- + 1] 오라이 int로
  대 (INT I = 1]. I <= N-; I는 ++)
    CIN >> 오라이 [I]가,
  IF (N->. 1) // 둘 이상의 요소가 병합, 순위가
    // 원래 머지 소트 전화, 머지 소트 (오라이, N)
  다른
    상기 출력 (오라이, N-)를
}

머지 소트 공극 (오라이 INT [], INT N-)
{
  INT = S. 1 tmpArray [N- + 1이다.]; // S는 각각의 방법은 두 개의 어레이 배열 (S 미만 지속될 수 배열 길이) 통합 시간의 길이
  그동안을 (S <N-)
  {
    newMerge (오라이, tmpArray, S, N-),
    S = 2 *;
  }
}

newMerge 공극 (오라이 INT [], INT tmpArray [], INT의 S, N-INT)
{
  // 병합 인접한 두 개의 정렬 된 어레이를 병합하여이 기능을 수행하지 않으면
  = I를 지능 1].
  그동안 (나는 < = N - 2 * S + 1 ) // 사용할 I + 2S - 1 <= N 유도 될 수있다
  {
    병합 (오라이, tmpArray, 난, S I + 1 - 난 * + S (2) - 1)..
    I = + S 개의 * 2;
  }
  IF (I <= N-- S) // 즉, 불충분 한 길이 (S)의이면의 마지막 두
    병합 (오라이, tmpArray, I, I S + 1 -, N-.)
  다른 // 즉,이 단부 (S)의 불충분 한 길이에 통합 단순히 tmpArray는 []에 직접 복사
    를위한 (; I ++; I <= N-)
      tmpArray가 [I] = 오라이 [I]을;

  //이 완료 트립 병합
  // 다시 []의 여기 화면을 코딩 오라이 복사
  (; K <= N-; INT = 0 K ++ K)에 대한
    오라이 [K] = tmpArray [K]

  (오라이, N-) 출력;
}

병합 공극 (오라이 INT [], INT tmpArray [], 좌측 INT, MID를 INT, 오른쪽 INT)
{
  // 배열 병합 개의 행이 복사 뒤쪽 tmpArray []로 정렬되어 오라이 []의
  INT tmpCnt 왼쪽 = // 임시 카운터
  INT rightStart = 중간 + 1; // 중반 실제로 leftEnd
  그동안 (좌 <= MID && rightstart <= 우측)
  {
    IF (오라이 [좌측] <= 오라이 [rightstart])
      tmpArray [tmpCnt ++] = 오라이 [좌측 ++]
    다른
      tmpArray [tmpCnt ++ = 오라이 [Rightstart ++]
  }
  // 누구 다음 tmpArray []에 직접 넣어 복수
  그동안 (좌회전 <= MID)
    tmpArray [tmpCnt ++ = 오라이 [좌측 ++ ]

  그동안 (Rightstart <= 우측)
    tmpArray [tmpCnt ++ = 오라이 [Rightstart ++]

}

보이드 출력 (INT 연산 [], INT는 않음)
{
  위해 (; i가 N <= I ++ I = 1 INT)
  COUT << OP [I] << "";
  COUT << ENDL;
}

HTTPS : //www.cnblogs.com/arcfat/archive/2012/12/06/2805701.html 재현

추천

출처blog.csdn.net/weixin_30703911/article/details/94789594