时间复杂度:O(n·logn)
空间复杂度:O(n)
归并排序分为拆分和归并两个过程。
拆分:
拆分是一个递归的过程,实质是将待排序数组均分再均分,直到将其拆分成一个个单独的元素为止,之后就是归并的过程,在归并的过程的完成排序。
归并:
归并的基本思想是现将左右两边先排好序,然后再让其进行有序的合并,最终使得整个数组都有序
实现:先开辟一个能容得下左右两部分的数组(假设为arr),再分别设置三个‘指针’:P、P1、P2分别存储arr、左边以及右边的下标;
p1和p2指针分别从两部分的左边出发,谁小谁的指针加一同时自身存入arr中。
最后一次归并将arr中的元素拷贝给原数组
动图展示:
![](https://img-blog.csdnimg.cn/img_convert/1bba950397e2b61878101499638f34a2.gif)
代码:
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
using namespace std;
void func(vector<int>& array, int begin, int end) {
int k = end - begin;
int middle = begin + k / 2;
if(k > 2) {
func(array, begin, middle);
func(array, middle, end);
}
int temp[k];
for(int i = 0, start = begin, centre = middle; i < k; i++) {
if(start < middle && centre < end) {
if(array[centre] < array[start]) {
temp[i] = array[centre];
centre++;
} else {
temp[i] = array[start];
start++;
}
} else if (centre < end) {
temp[i] = array[centre];
centre++;
} else {
temp[i] = array[start];
start++;
}
}
for (int i = 0; i < k; i++) array[i + begin] = temp[i];
}
int main() {
srand(time(0));
vector<int> array(5);
for(int j = 0; j < 5; j++){
for (int i = 0; i < 5; i++) array[i] = rand()%(26);
func (array, 0, 5);
for (int i = 0; i< 5; i++) cout<<array[i]<<' ';
cout<<endl;
}
return 0;
}