递归实现
#include<iostream>
#include<vector>
#include<deque>
#include<limits.h>
#include<string>
void Copy(int* dist, int* src, int left, int right)
{
for (int i = left; i <= right; ++i)
{
dist[i] = src[i];
}
}
void Merge(int *dist,int *src, int left, int m, int right)
{
int i = left, j = m + 1;
int k = left;
while (i <= m && j <= right)
{
dist[k++] = src[i] < src[j] ? src[i++] : src[j++];
}
while (i <= m)
{
dist[k++] = src[i++];
}
while (j <= right)
{
dist[k++] = src[j++];
}
}
void MergePass(int* br, int* ar, int left, int right)
{
if (left < right) // 1
{
int mid = (right - left) / 2 + left;
MergePass(br, ar, left, mid);
MergePass(br, ar, mid + 1, right);
Merge(br, ar, left, mid, right);
Copy(ar, br, left, right);
}
}
void MergeSort(int* ar, int n)
{
if (ar == nullptr || n < 1) return;
int* br = new int[n];
MergePass(br, ar, 0, n - 1);
delete[] br;
}
int main()
{
int ar[] = { 14,56,34,100,23,78,93,12,45,67,88 };
int n = sizeof(ar) / sizeof(ar[0]);
MergeSort(ar, n);
for (auto & x : ar)
{
cout << x << " ";
}
cout << endl;
return 0;
}
非递归实现
void Copy(int* dist, int* src, int left, int right)
{
for (int i = left; i <= right; ++i)
{
dist[i] = src[i];
}
}
void Merge(int *dist,int *src, int left, int m, int right)
{
int i = left, j = m + 1;
int k = left;
while (i <= m && j <= right)
{
dist[k++] = src[i] < src[j] ? src[i++] : src[j++];
}
while (i <= m)
{
dist[k++] = src[i++];
}
while (j <= right)
{
dist[k++] = src[j++];
}
}
void MergePass(int* dist, int* src,int n,int s)
{ // // i+2*s-1 <= n-1
int i = 0;
for ( ; i+2*s <= n; i = i + 2 * s)
{
Merge(dist, src, i, i + s - 1, i + 2 * s - 1);
}
if (n-1 > i+s-1)
{
Merge(dist, src, i, i + s - 1, n - 1);
}
else
{
for (int j = i; j < n; ++j)
{
dist[j] = src[j];
}
}
}
void MergeSort(int* ar, int n)
{
if (ar == nullptr || n < 1) return;
int* br = new int[n];
int s = 1;//划分的区间中元素的数量
while (s < n)
{
MergePass(br, ar, n, s); // 1 // 4 // 16
s += s;
MergePass(ar, br, n, s); // 2 // 8
s += s;
}
delete[]br;
}
int main()
{
int ar[] = { 14,56,34,100,23,78,93,12,45,67,88 };
int n = sizeof(ar) / sizeof(ar[0]);
MergeSort(ar, n);
for (auto & x : ar)
{
cout << x << " ";
}
cout << endl;
return 0;
}
图论