归并排序(Merge sort)
- 平均时间复杂度:O(nlogn)
- 最好情况:O(nlogn)
- 最坏情况:O(nlogn)
- 空间复杂度:O(n)
- 排序方式:外部
-
C++代码实现
void Merge(vector<int> &arr, int lhs, int mid, int rhs) {//优化一if(arr[mid-1]<=arr[mid]) return;vector<int> tempArr={};int l_pos = lhs;int r_pos = mid;while(l_pos<mid&&r_pos<rhs){if(arr[l_pos] < arr[r_pos])tempArr.push_back(arr[l_pos++]);elsetempArr.push_back(arr[r_pos++]);}while(l_pos<mid){tempArr.push_back(arr[l_pos++]);}while(r_pos<rhs){tempArr.push_back(arr[r_pos++]);}for(const auto& val:tempArr){arr[lhs++] = val;}}void mergeSort(vector<int>& arr, int lhs, int rhs) {if(lhs+1 >= rhs) return;int mid = lhs+((rhs - lhs)>>1);mergeSort(arr, lhs, mid);mergeSort(arr, mid, rhs);Merge(arr, lhs, mid, rhs);}
1. 算法步骤
- 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列;
- 设定两个指针,最初位置分别为两个已经排序序列的起始位置;
- 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置;
- 重复步骤 3 直到某一指针达到序列尾;
- 将另一序列剩下的所有元素直接复制到合并序列尾。
优化步骤
① 辅助数组作为参数传入,减少创建时间
② 对于较小规模的字序列排序,使用插入排序
③ 判断合并序列是否已经有序,如果arr[mid-1] <= arr[mid],则有序跳过merge函数
2. 动图演示

