算法思想
该算法采用分治法(divide and conquer),作为一种典型的分而治之的思想,归并法的排序可以通过自下而上进行递归,也可以通过自底向上迭代来完成
通过递归算法
/*
* @Descripttion:
* @version:
* @Author: 秀玉轩晨
* @Date: 2021-09-27 16:26:57
* @LastEditors: 秀玉轩晨
* @LastEditTime: 2021-09-27 21:02:48
*/
using namespace std;
#include <iostream>
#include <vector>
class MergeSort {
public:
void merge(vector<int> &array, int left, int middle, int right) {
//low为第1有序区的第1个元素,i指向第1个元素, mid为第1有序区的最后1个元素
int i = left, j = middle + 1, k = 0;
// 设置临时数组
vector<int> temp(right - left + 1);
while(i <= middle && j <= right) {
if (array[i] <= array[j]) {
temp[k++] = array[i++];
} else {
temp[k++] = array[j++];
}
}
//若比较完之后,第一个有序区仍有剩余,则直接复制到t数组中
while(i <= middle) {
temp[k++] = array[i++];
}
// 同上
while(j <= right) {
temp[k++] = array[j++];
}
//将排好序的存回arr中low到high这区间
for (i = left, k = 0; i <= right; i++,k++) {
array[i] = temp[k];
}
vector <int>().swap(temp); //清除容器并最小化它的容量
}
void mergeSort(vector<int> &array, int left, int right) {
if(left >= right){
return;
}
// 选取中间位置对数组分割
int middle = (left + right) /2;
mergeSort(array, left, middle);
mergeSort(array, middle + 1, right);
// 开始进行合并排序
merge(array, left, middle, right);
}
};
int main() {
vector<int> arr = {4,1,4,5,1,7,3,9,0,5};
MergeSort sort;
sort.mergeSort(arr, 0 , arr.size() -1 );
for (int i = 0; i < arr.size(); i++)
cout << arr[i] << " ";
cout << endl;
return 0;
}