归并排序:是分治算法的典型应用,通过将无序数组分成更小的子数组,利用单个数字总是有序的特性,对子数组进行排序,最后合并。首先把一个数组中的元素,按照某一方法,先拆分了之后,按照一定的顺序各自排列,然后再归并到一起,使得归并后依然是有一定顺序的。类似二叉树结构,时间复杂度O(nlogn),最坏情况O(nlogn),是一种稳定排序方法。主要实现过程示意图如下:
#include<iostream>
#include<vector>
using namespace std;
#子数组排序
void merge(vector<int>&A, int left, int mid, int right) {
int n1 = mid - left+1;
int n2 = right - mid;
vector<int>L(n1);
vector<int>R(n2);
for (int i = 0;i < n1;i++) L[i] = A[left + i];
for (int j = 0;j < n2;j++) R[j] = A[mid + j+1];
int i = 0, j = 0;
for (int k = left;k <= right;k++) {
if (j >= n2 || (i < n1 && L[i] <= R[j])) {
A[k] = L[i++];
}
else {
A[k] = R[j++];
}
}
}
#递归方法实现
void merge_sort(vector<int>&A, int left, int right) {
if (left < right) {
int mid = (right + left) / 2;
merge_sort(A, left, mid);
merge_sort(A, mid+1, right);
merge(A, left, mid, right);
}
return;
}
#测试结果
int main() {
vector<int>A{10,23,34,234,23,121,3,4,535,342,12,908};
int n = A.size();
merge_sort(A, 0, n-1);
for (int i = 0;i < n;i++) {
cout << A[i]<<" ";
}
system("pause");
return 0;
}
来源:CSDN
作者:wf0934
链接:https://blog.csdn.net/wf0934/article/details/103805116