#include <iostream>
#include <vector>
#include <ctime>
using namespace std;
//T_vec: Target_vector, B_val : Begin_value , Mid_ , End_
void Merge(vector<int>& T_vec, int B_val, int M_val, int E_val)
{
int B_idx = B_val;
int M_idx = M_val + 1;
int Tar_idx = B_idx;
int Swap_idx = B_idx;
vector<int> Temp_vec(T_vec.size());
//比较两组的大小,将小的先加入到Temp_vec中
while (B_idx <= M_val && M_idx <= E_val)
{
if (T_vec[B_idx] > T_vec[M_idx])
{
Temp_vec[Tar_idx++] = T_vec[M_idx++];
}
else
{
Temp_vec[Tar_idx++] = T_vec[B_idx++];
}
}
//上面的循环退出,将剩余的元素直接加入即可,因为已经是有序的了
while (B_idx <= M_val)
{
Temp_vec[Tar_idx++] = T_vec[B_idx++];
}
while (M_idx <= E_val)
{
Temp_vec[Tar_idx++] = T_vec[M_idx++];
}
//最后,将Temp_vec中的元素放到目标容器中
while (Swap_idx <= E_val)
{
T_vec[Swap_idx] = Temp_vec[Swap_idx];
++Swap_idx;
}
}
//Arr_Elem_Level为一个组里有的元素的个数
void MergePass(vector<int>& T_vec, int Arr_Elem_Level, int E_val)
{
int B_idx = 0;
//以为是两组两组排序所有Arr_Elem_Level这里要乘2
while (B_idx <= E_val - Arr_Elem_Level * 2)
{
//减一是为了对应下标
Merge(T_vec, B_idx, B_idx + Arr_Elem_Level - 1, B_idx + Arr_Elem_Level * 2 - 1);
B_idx = B_idx + Arr_Elem_Level * 2;
}
//如果成立,说明还有一组大小为Arr_Elem_Level的元素未被分组
if (B_idx < E_val - Arr_Elem_Level)
{
Merge(T_vec, B_idx, B_idx + Arr_Elem_Level - 1, E_val - 1);
}
else
{
while (B_idx < E_val)
{
//将不能分组的直接原样插入
T_vec[B_idx] = T_vec[B_idx];
++B_idx;
}
}
}
void MergeSort(vector<int>& T_vec)
{
int Elem = 1;
while (Elem <= T_vec.size())
{
MergePass(T_vec, Elem, T_vec.size());
Elem = Elem * 2;
}
}
void Text()
{
vector<int> T_vec;
srand((unsigned)time(nullptr));
cout << "输入需要排序的个数: " << "\n";
int Num;
cin >> Num;
while (Num > 0)
{
T_vec.emplace_back(rand() % 10);
--Num;
}
cout << "排序前: ";
for (vector<int>::iterator it = T_vec.begin(); it != T_vec.end(); ++it)
{
cout << *it << " ";
}
cout << "\n";
MergeSort(T_vec);
cout << "排序后: ";
for (vector<int>::iterator it = T_vec.begin(); it != T_vec.end(); ++it)
{
cout << *it << " ";
}
cout << "\n";
}
int main()
{
Text();
system("pause");
return 0;
}
C++实现迭代版归并排序
最新推荐文章于 2024-08-03 11:47:07 发布