#include <iostream>
using namespace std;
/*
* 归并排序核心步骤
* 1、数组分2段
* 2、分别将左右2段进行排序
* 3、合并
*/
void merge_sort(int* left_array, int *right_array, int left_size, int right_size)
{
int left_pos = 0, right_pos = 0, new_array_pos = 0; // 分别指向左右2个数组的位置
int max_size = left_size + right_size; // 数组全部元素个数
int* new_array = new int[max_size]; // 用于存放和合并后的数组
/* 开始进行排序合并 */
while (left_pos < left_size && right_pos < right_size)
{
/* 判断哪边的数据元素最小,将该数组的元素放在新的数组中 */
if (left_array[left_pos] < right_array[right_pos])
{
new_array[new_array_pos] = left_array[left_pos];
left_pos++;
new_array_pos++;
}
else
{
new_array[new_array_pos] = right_array[right_pos];
right_pos++;
new_array_pos++;
}
}
/* 存在一边的数组排序完之后,另一边的数组还有个数,依次放入即可 */
/* 左边数组没有放完情况 */
while (left_pos < left_size && new_array_pos < max_size)
{
new_array[new_array_pos] = left_array[left_pos];
left_pos++;
new_array_pos++;
}
/* 右边数组没有放完情况 */
while (right_pos < right_size && new_array_pos < max_size)
{
new_array[new_array_pos] = right_array[right_pos];
right_pos++;
new_array_pos++;
}
/* 将合并后的数组给左边的数组 -- 左边的数组是从下标0开始的 */
for (int i = 0; i < max_size; ++i)
{
left_array[i] = new_array[i];
}
delete[]new_array;
}
void merge(int* a, int len)
{
/* 将数组分2段 */
int left_size = len / 2; // 左边数组长度
int right_size = len - left_size; // 右边数组长度
int* left_array = a; // 被拆分的左边数组
int* right_array = a + left_size; // 被拆分的右边数组
/* 进行分治和合并 */
if (len <= 1)
{
return; // 递归出口
}
else
{
merge(left_array, left_size); // 递归左边数组直到数组元素个数为1
merge(right_array, right_size); // 递归右边数组直到数组元素个数为1
merge_sort(left_array, right_array, left_size, right_size); // 合并2个数组得到全部元素
}
}
int main()
{
int a[] = { 4, 5, 2, 6, 8, 7, 1, 3 };
merge(a, 8);
for (auto e : a)
{
cout << e << " ";
}
return 0;
}
#endif
归并排序
最新推荐文章于 2023-12-11 10:45:47 发布