병합 정렬의 실현 코드와 사고방식

2497 단어 병합 정렬
우선 두 개의 질서수열을 어떻게 합치는지 고려해 보자.이것은 매우 간단하다. 두 개의 수열의 첫 번째 수를 비교하기만 하면 누가 작으면 먼저 누구를 취하고 취한 후에 대응하는 수열에서 이 수를 삭제한다.그 다음에 비교를 해서 만약 수열이 비어 있다면 다른 수열의 데이터를 순서대로 꺼내면 된다.

View Code
 // a[] b[] c[]
 void MemeryArray(int a[], int n, int b[], int m, int c[])
 {
     int i, j, k;

     i = j = k = 0;
     while (i < n && j < m)
     {
         if (a[i] < b[j])
             c[k++] = a[i++];
         else
             c[k++] = b[j++];
     }

     while (i < n)
         c[k++] = a[i++];

     while (j < m)
         c[k++] = b[j++];
 }
병합 질서수열의 효율이 비교적 높다는 것을 알 수 있으며 O(n)에 도달할 수 있다.
위의 병합 질서 수열 문제를 해결한 다음에 병합 정렬을 보면 그의 기본적인 사고방식은 수조를 2조 A, B로 나누는 것이다. 만약에 이 2조 내의 데이터가 모두 질서정연하다면 이 2조 데이터를 편리하게 정렬할 수 있다.어떻게 이 두 그룹 내의 데이터를 질서정연하게 합니까?
A, B조를 각각 두 조로 나눌 수 있다.순서대로 유추하면 나누어진 그룹이 데이터가 하나밖에 없을 때 이 그룹 안에 질서가 있다고 생각하고 인접한 두 그룹을 합병하면 된다.이렇게 하면 먼저 귀속된 분해 수열을 통해 다시 수열을 합치면 귀속 정렬이 완성된다.

View Code
 // a[first...mid] a[mid...last] 。
 void mergearray(int a[], int first, int mid, int last, int temp[])
 {
     int i = first, j = mid + 1;
     int m = mid,   n = last;
     int k = 0;

     while (i <= m && j <= n)
     {
         if (a[i] <= a[j])
             temp[k++] = a[i++];
         else
             temp[k++] = a[j++];
     }

     while (i <= m)
         temp[k++] = a[i++];

     while (j <= n)
         temp[k++] = a[j++];

     for (i = 0; i < k; i++)
         a[first + i] = temp[i];
 }
 void mergesort(int a[], int first, int last, int temp[])
 {
     if (first < last)
     {
         int mid = (first + last) / 2;
         mergesort(a, first, mid, temp);    //
         mergesort(a, mid + 1, last, temp); //
         mergearray(a, first, mid, last, temp); //
     }
 }

 bool MergeSort(int a[], int n)
 {
     int *p = new int[n];
     if (p == NULL)
         return false;
     mergesort(a, 0, n - 1, p);
     delete[] p;
     return true;
 }
병합 정렬의 효율은 비교적 높다. 수열의 길이를 N으로 설정하고 수열을 작은 수열로 나누어 모두 logN 단계를 해야 한다. 매 단계는 질서정연한 수열을 통합하는 과정이고 시간의 복잡도는 O(N)로 기록할 수 있기 때문에 모두 O(N*logN)이다.병합 정렬은 매번 인접한 데이터에서 조작되기 때문에 병합 정렬은 O(N*logN)의 몇 가지 정렬 방법(빠른 정렬, 병합 정렬, 힐 정렬, 무더기 정렬)도 효율이 비교적 높다.

좋은 웹페이지 즐겨찾기