병합 정렬의 실현 코드와 사고방식
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)의 몇 가지 정렬 방법(빠른 정렬, 병합 정렬, 힐 정렬, 무더기 정렬)도 효율이 비교적 높다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Java 정렬 알고리즘 요약 병합 정렬병합 조작(merge)은 병합 알고리즘이라고도 하는데 이미 정렬된 두 서열을 하나의 서열로 합친 조작을 가리킨다.빠른 정렬과 유사하게 자바에서 통합된 것을 살펴봅시다. 병합 정렬(Merge)은 두 개 이상의 순서표를...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.