归并排序的C++实现,算法的主要思想是分而治之,递归调用,将待排序的数组不停的拆分成一个个小数组,直到小数组中只有一个数,然后进行合并操作。
另外,采用随机数种子(time)生成随机数插入到数组中,保证每次执行结果都不同。
时间复杂度: O(n*logn)
空间复杂度:O(1)
稳定性:稳定
#include <iostream>
#include <vector>
#include <time.h>
#include <stdlib.h>
using namespace std;
void merge(vector<int> &arr, int start, int mid, int end)
{
vector<int> tmp;
int i = start;
int j = mid + 1;
while (i <= mid && j <= end)
{
if (arr[i] <= arr[j])
tmp.push_back(arr[i++]);
else
tmp.push_back(arr[j++]);
}
while (i <= mid)
tmp.push_back(arr[i++]);
while (j <= end)
tmp.push_back(arr[j++]);
// 将已排序的数据赋值给原数组
for (int i = 0; i < tmp.size(); ++i)
{
arr[start + i] = tmp[i];
}
}
void mergeSort(vector<int> &arr, int start, int end)
{
if (arr.empty() || start >= end)
return;
// 避免两数直接相加,造成数据溢出
int mid = start + (end - start) / 2;
// 递归调用
mergeSort(arr, start, mid);
mergeSort(arr, mid + 1, end);
// 归并
merge(arr, start, mid, end);
}
int main()
{
// 随机数
std::srand(time(NULL));
int i = 0;
vector<int> v;
// 生成随机数,存入到数组中
while (i < 20)
v.push_back(rand() % 1000 + (i++));
// 归并排序
mergeSort(v, 0, v.size() - 1);
for (int i = 0; i < v.size(); ++i)
cout << v[i] << " ";
cout << endl;
system("pause");
return EXIT_SUCCESS;
}