思想: 使用分治的思想。把一组数组等分,然后把等分后的左右数组都进行排序(同样等分,使用递归直到左右都为一个元素,然后归并一起),然后进行归并在一起。
时间复杂度: Θ(nlgn)
C++实现:
// test_1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include<vector>
using namespace std;
//归并排序
void Merge(vector<int>& list, int left, int mid, int right, vector<int>& temp)
{
int i = left;//左边数组第一个索引
int j = mid + 1;//右边数组第一个索引
int t = 0;
while (i <= mid && j <= right)
{
if (list[i] < list[j])
{
temp[t++] = list[i++];
}
else
{
temp[t++] = list[j++];
}
}
while (i <= mid)
{//如果左边有剩余
temp[t++] = list[i++];
}
while (j <= right)
{//如果右边有剩余
temp[t++] = list[j++];
}
t = 0;
while (left <= right)
{//把排序范围内的数值赋给原数组
list[left++] = temp[t++];
}
}
void Sort(vector<int>& list, int left, int right, vector<int>& temp)
{
if (left < right)
{
//if (right - left == 1)return;
int mid = (left + right) / 2;
//多个元素需要拆分为左右两个数组排序后,然后合并
Sort(list, left, mid, temp);//对左边数组排序
Sort(list, mid+1, right, temp);//对右边的数组排序
Merge(list, left, mid, right, temp);//合并左右数组
}
else
{
//只有一个元素不做任何处理
}
}
int main()
{
//0 --插入排序
//1 --归并排序
int index = 1;
vector<int> intput_array;
int num;
cout << "输入一串数组:";
while (true)
{
cin >> num;
intput_array.push_back(num);
if (cin.get() == '\n')
break;
}
int length = intput_array.size();
cout << "排序结果为:" << endl;
#pragma region 归并排序
vector<int> temp(length);
Sort(intput_array, 0, length - 1, temp);
for (int i = 0; i < length; i++)
{
printf("%d ", intput_array[i]);
}
#pragma endregion
return 0;
}