1.根据题意,编写归并排序算法,如下:
bool isMerge = false;
for (int step = 1; step / 2 < n; step *= 2)
{//步进初始为1,第二次为2,第三次为4,如此类推
for (int i = 0; i < n; i += 2 * step)
{
vector<int> tmpArr(2 * step);
int first = i;
int second = i+step;
int idx = 0;
int k = 0;
while (first<min(n,i+step)||second<min(n,i+2*step))
{//通过first和second指针,把数组分为两个,然后进行归并排序
if (first<min(n, i + step) && second<min(n, i + 2 * step))
{
if (num2[first] < num2[second])
tmpArr[idx++] = num2[first++];
else
tmpArr[idx++] = num2[second++];
}
else if (first<min(n, i + step))//second已经遍历完,剩下first数组
tmpArr[idx++] = num2[first++];
else//first已经遍历完,剩下second数组
tmpArr[idx++] = num2[second++];
}
for (int k = 0; k < 2 * step&&i + k < n; k++)
num2[i + k] = tmpArr[k];
}
if (!isMerge&&num2 == target)
isMerge = true;
else if (isMerge)
break;
}
AC源代码:
//#include<string>
//#include <iomanip>
#include<vector>
#include <algorithm>
//#include<stack>
#include<set>
#include<queue>
#include<map>
//#include<unordered_set>
#include<unordered_map>
//#include <sstream>
//#include "func.h"
//#include <list>
#include<stdio.h>
#include<iostream>
#include<string>
#include<memory.h>
#include<limits.h>
using namespace std;
int main(void)
{
int n;
cin >> n;
vector<int> num(n);
vector<int> num2(n);
vector<int> target(n);
for (int i = 0; i < n; i++)
{
scanf("%d", &num[i]);
}
num2 = num;
for (int i = 0; i < n; i++)
{
scanf("%d", &target[i]);
}
bool isInsert = false;
for (int i = 1; i < n; i++)
{
int j = i;
int tmp = num[i];
for (; j > 0 && num[j - 1] > tmp; j--)
{
num[j] = num[j - 1];
}
num[j] = tmp;
if (!isInsert && target == num)
isInsert=true;
else if (isInsert)
break;
}
if (isInsert)
{
cout << "Insertion Sort" << endl;
for (int i = 0; i < num.size(); i++)
{
cout << num[i];
if (i != num.size() - 1)
cout << " ";
}
cout << endl;
return 0;
}
bool isMerge = false;
for (int step = 1; step / 2 < n; step *= 2)
{//步进初始为1,第二次为2,第三次为4,如此类推
for (int i = 0; i < n; i += 2 * step)
{
vector<int> tmpArr(2 * step);
int first = i;
int second = i+step;
int idx = 0;
int k = 0;
while (first<min(n,i+step)||second<min(n,i+2*step))
{//通过first和second指针,把数组分为两个,然后进行归并排序
if (first<min(n, i + step) && second<min(n, i + 2 * step))
{
if (num2[first] < num2[second])
tmpArr[idx++] = num2[first++];
else
tmpArr[idx++] = num2[second++];
}
else if (first<min(n, i + step))//second已经遍历完,剩下first数组
tmpArr[idx++] = num2[first++];
else//first已经遍历完,剩下second数组
tmpArr[idx++] = num2[second++];
}
for (int k = 0; k < 2 * step&&i + k < n; k++)
num2[i + k] = tmpArr[k];
}
if (!isMerge&&num2 == target)
isMerge = true;
else if (isMerge)
break;
}
cout << "Merge Sort" << endl;
for (int i = 0; i < num2.size(); i++)
{
cout << num2[i];
if (i != num2.size() - 1)
cout << " ";
}
cout << endl;
return 0;
}