基于
C++
,利用
vector
实现归并排序.
理论部分可点击博主博客 温故而知新 -> 数据结构 ->排序 进行查看!
1 递归写法
实现代码
#include<iostream>
#include<vector>
using namespace std;
void merge(vector<int>& arr, int begin, int end, int mid)
{
int begin1 = begin;
int end1 = mid;
int begin2 = mid + 1;
int end2 = end;
vector<int> tmp(arr.size());
int idx = begin;
while (begin1 <= end1 && begin2 <= end2)
{
if (arr[begin1] <= arr[begin2])
tmp[idx++] = arr[begin1++];
else
tmp[idx++] = arr[begin2++];
}
while (begin1 <= end1)
{
tmp[idx++] = arr[begin1++];
}
while (begin2 <= end2)
{
tmp[idx++] = arr[begin2++];
}
while (begin <= end)
{
arr[begin] = tmp[begin];
begin++;
}
}
void _mergeSort(vector<int>& arr, int begin, int end)
{
if (begin >= end)
return;
int mid = begin + (end - begin) / 2;
_mergeSort(arr, begin, mid);
_mergeSort(arr, mid + 1, end);
merge(arr, begin, end, mid);
}
void mergeSort(vector<int>& arr)
{
_mergeSort(arr, 0, arr.size() - 1);
}
void test()
{
vector<int> arr = { 5, 8, 1, 6, 7, 9, 3, 4, 12, 2, 11, 10};
mySwap(arr, 0, 1);
cout << "原数组为:";displayArrays(arr);
mergeSort(arr);
cout << "归并后:"; displayArrays(arr);
}
int main()
{
test();
return 0;
}
运行结果
2 非递归
void merge(vector<int>& arr, int begin, int end, int mid)
{
int begin1 = begin;
int end1 = mid;
int begin2 = mid + 1;
int end2 = end;
vector<int> tmp(arr.size());
int idx = begin;
while (begin1 <= end1 && begin2 <= end2)
{
if (arr[begin1] <= arr[begin2])
tmp[idx++] = arr[begin1++];
else
tmp[idx++] = arr[begin2++];
}
while (begin1 <= end1)
{
tmp[idx++] = arr[begin1++];
}
while (begin2 <= end2)
{
tmp[idx++] = arr[begin2++];
}
while (begin <= end)
{
arr[begin] = tmp[begin];
begin++;
}
}
//非递归
void mergeSortNor(vector<int>& arr)
{
//子序列的步长
int step = 1;
while (step < arr.size())
{
for (int idx = 0; idx < arr.size(); idx += 2 * step)
{
int begin = idx;
int mid = idx + step - 1;
if (mid >= arr.size() - 1)
continue;
int end = idx + 2 * step - 1;
if (end >= arr.size())
end = arr.size() - 1;
merge(arr, begin, end, mid);
}
step *= 2;
}
}
void test()
{
vector<int> arr = { 5, 8, 1, 6, 7, 9, 3, 4, 12, 2, 11, 10};
mySwap(arr, 0, 1);
cout << "原数组为:";displayArrays(arr);
mergeSortNor(arr);
cout << "归并后:"; displayArrays(arr);
}
int main()
{
test();
return 0;
}