1.归并排序 O(nlogn) stable

#include <iostream>
#include <vector>
using namespace std;void merge(vector<int>& arr, int l, int mid, int r){int n1 = mid - l + 1, n2 = r - mid;vector<int> left(n1);vector<int> right(n2);for(int i = 0; i < n1; ++i) left[i] = arr[l + i];for(int i = 0; i < n2; ++i) right[i] = arr[mid + 1 + i];int i = 0, j = 0, k = l;while(i < n1 && j < n2){if(left[i] <= right[j]) arr[k++] = left[i++];else arr[k++] = right[j++];}while(i < n1) arr[k++] = left[i++];while(j < n2) arr[k++] = right[j++];
}void mergeSort(vector<int>& arr, int l, int r){if(l < r){int mid = (l + r) / 2;mergeSort(arr, l, mid);mergeSort(arr, mid + 1, r);merge(arr, l, mid, r);}
}int main(){vector<int> input = {3, 4, 6, 1, 9, 5, 2, 7, 0, 8};mergeSort(input, 0, input.size() - 1);for(int i : input)cout << i << " ";return 0;
}

2.数组中逆序对个数Count Inversions

#include <iostream>
#include <vector>
using namespace std;int merge(vector<int>& arr, int l, int mid, int r);int mergeSort(vector<int>& arr, int l, int r){int invCount = 0;if(l < r){int mid = (l + r) / 2;invCount = mergeSort(arr, l, mid);invCount += mergeSort(arr, mid + 1, r);invCount += merge(arr, l, mid, r); }return invCount;
}int merge(vector<int>& arr, int l, int mid, int r){int n1 = mid - l + 1, n2 = r - mid;vector<int> left(n1);vector<int> right(n2);for(int i = 0; i < n1; ++i) left[i] = arr[l + i];for(int i = 0; i < n2; ++i) right[i] = arr[mid + 1 + i];int i = 0, j = 0, k = l;int invCount = 0;while(i < n1 && j < n2){if(left[i] > right[j]){invCount += mid - i + 1;arr[k++] = right[j++];}elsearr[k++] = left[i++];}while(i < n1) arr[k++] = left[i++];while(j < n2) arr[k++] = right[j++];return invCount;
}int main(){vector<int> input = {1, 3, 5, 2, 4};int ans = mergeSort(input, 0, input.size() - 1);for(int i : input)cout << i << " ";cout << endl;cout << ans;return 0;
}

3.Leetcode 493 Reverse Pairs

Given an array nums, we call (i, j) an important reverse pair if i < j and nums[i] > 2 * nums[j]. You need to return the number of important reverse pairs in the given array.

class Solution {
public:vector<int> helper;int reversePairs(vector<int>& nums) {helper.resize(nums.size());return mergeSort(nums, 0, nums.size() - 1);}int mergeSort(vector<int>& nums, int s, int e){if(s >= e) return 0;int mid = s + (e - s) / 2;int cnt = mergeSort(nums, s, mid) + mergeSort(nums, mid + 1, e);for(int i = s, j = mid + 1; i <= mid; ++i){while(j <= e && nums[i] / 2.0 > nums[j])j++;cnt += j - (mid + 1);}merge(nums, s, mid, e);return cnt;}void merge(vector<int>& nums, int s, int mid, int e){for(int i = s; i <= e; ++i) helper[i] = nums[i];int p1 = s;int p2 = mid + 1;int i = s;while(p1 <= mid || p2 <= e){  //注意这个merge的逻辑if(p1 > mid || p2 <= e && helper[p1] >= helper[p2])nums[i++] = helper[p2++];elsenums[i++] = helper[p1++];}}};

4.Leetcode 315 Count  of Smaller Numbers After self

You are given an integer array nums and you have to return a new counts array. The counts array has the porperty where counts[i] is the number o f smaller elements to the right of nums[i].

class Solution {
public:unordered_map<int, int> count;vector<int> helper;vector<int> countSmaller(vector<int>& nums) {vector<int> numsCopy = nums;helper.resize(nums.size());vector<int> res(nums.size());mergeSort(nums, 0, nums.size() - 1);for(int i = 0; i < nums.size(); ++i){res[i] = count[numsCopy[i]]; }return res;}void mergeSort(vector<int>& nums, int s, int e){if(s < e){int mid = s + (e - s) / 2;mergeSort(nums, s, mid);mergeSort(nums, mid + 1, e);for(int i = s, j = mid + 1; i <= mid; ++i){while(j <= e && nums[i] > nums[j])j++;count[nums[i]] += j - (mid + 1);}merge(nums, s, mid, e);}}void merge(vector<int>& nums, int s, int mid, int e){for(int i = s; i <= e; ++i) helper[i] = nums[i];int p1 = s;int p2 = mid + 1;int i = s;while(p1 <= mid || p2 <= e){if(p1 > mid || p2 <= e && helper[p1] >= helper[p2]) nums[i++] = helper[p2++];else nums[i++] = helper[p1++];}}
};

5.Count of Range Sum

Given an interger array nums, return the number of range sums that lie in [lower, upper] inclusive. Range sum S(i, j) is defined as the sum of the elements in nums between indices i and j (i <= j), inclusive.

Note: A naive algorithm of $O(n_2)$ is trivial. You MUST do better than that.

class Solution {
public:int countRangeSum(vector<int>& nums, int lower, int upper) {int size = nums.size();if(size == 0) return 0;vector<long> sums(size + 1, 0);for(int i = 0; i < size; ++i)sums[i + 1] = sums[i] + nums[i];return help(sums, 0, size + 1, lower, upper);}int help(vector<long>& sums, int start, int end, int lower, int upper){if(end - start <= 1) return 0;int mid = (start + end) / 2;int cnt = help(sums, start, mid, lower, upper) + help(sums, mid, end, lower, upper);int m = mid, n = mid, t = mid, len = 0;vector<long> cache(end - start, 0);for(int i = start, s = 0; i < mid; ++i, ++s){while(m < end && sums[m] - sums[i] < lower) ++m;while(n < end && sums[n] - sums[i] <= upper) ++n;cnt += n - m;while(t < end && sums[t] < sums[i]) cache[s++] = sums[t++];cache[s] = sums[i];len = s;}for(int i = 0; i <= len; ++i) sums[start + i] = cache[i];return cnt;}
};

转载于:https://www.cnblogs.com/betaa/p/11438599.html

Merge Sort及其对一类问题的应用相关推荐

  1. python代码实现归并排序(Merge Sort )

    python代码实现归并排序(Merge Sort ) 归并排序(Merge Sort) 归并排序,是创建在归并操作上的一种有效的排序算法.算法是采用分治法(Divide and Conquer)的一 ...

  2. [算法]——归并排序(Merge Sort)

    归并排序(Merge Sort)与快速排序思想类似:将待排序数据分成两部分,继续将两个子部分进行递归的归并排序:然后将已经有序的两个子部分进行合并,最终完成排序.其时间复杂度与快速排序均为O(nlog ...

  3. C语言merge sort归并排序算法(附完整源码)

    C语言merge sort归并排序算法 merge sort归并排序算法的完整源码(定义,实现) merge sort归并排序算法的完整源码(定义,实现) #ifndef MERGE_SORT_H # ...

  4. C++使用Merge Sort排序计数反转的实现算法(附完整源码)

    C++使用Merge Sort排序计数反转的实现算法 C++使用Merge Sort排序计数反转的实现算法完整源码(定义,实现,main函数测试) C++使用Merge Sort排序计数反转的实现算法 ...

  5. C语言以递归实现归并排序Merge Sort算法(附完整源码)

    以递归实现归并排序Merge Sort 以递归实现归并排序Merge Sort算法的完整源码(定义,实现,main函数测试) 以递归实现归并排序Merge Sort算法的完整源码(定义,实现,main ...

  6. C语言归并排序Merge Sort算法(附完整源码)

    归并排序Merge Sort 归并排序Merge Sort算法的完整源码(定义,实现,main函数测试) 归并排序Merge Sort算法的完整源码(定义,实现,main函数测试) #include ...

  7. 排序算法二:归并排序(Merge sort)

    归并排序(Merge sort)用到了分治思想,即分-治-合三步,算法平均时间复杂度是O(nlgn). (一)算法实现 1 private void merge_sort(int[] array, i ...

  8. python选择排序算法图解_python基本算法之实现归并排序(Merge sort)

    0.前言 评判一个算法的好坏的标准: 时间复杂度 空间复杂度 1.归并排序算法是什么? 冒泡排序(Bubble Sort)是一种建立在归并操作上面的一种有效的排序算法,由John von neuman ...

  9. python 归并排序算法_python基本算法之实现归并排序(Merge sort)

    0.前言 评判一个算法的好坏的标准: 时间复杂度 空间复杂度 1.归并排序算法是什么? 冒泡排序(Bubble Sort)是一种建立在归并操作上面的一种有效的排序算法,由John von neuman ...

最新文章

  1. 行集函数:OpenRowSet 和 OpenQuery
  2. Cinder LVM backend cinder-volume service down
  3. nas服务器搭建 linux,小白都能看懂的NAS服务器搭建教程
  4. python 命令-Django 基本命令
  5. eureka hostname作用_SpringCloud基础教程(三)-Eureka进阶
  6. 20154319 《网络对抗技术》后门原理与实践
  7. CentOS系统修改IP
  8. 在idea中部署Tomcat
  9. 狂神说笔记——JavaScript快速入门11
  10. 电子邮件客户端程序设计与实现
  11. 【Python百日进阶-Web开发-Feffery】Day418 - fac实例:dash+fac登录-Sqlite数据库
  12. php的简单网站设计
  13. “天涯博客”“江西福利彩票网”等网站被挂马
  14. 三角测量(triangulation)
  15. linux 查看es进程,Linux---关闭Elasticsearch进程,并重新启动
  16. 英语智能语音测试软件,卓帆英语人机对话智能评测练习软件
  17. leaflet 降雨等值面的动画效果
  18. Liunx基础命令 - mv剪切命令
  19. 5个有用的 CSS 布局生成器
  20. Java学习_Day 18(学习内容:尚硅谷IO流JAVA零基础P598-P612)

热门文章

  1. 洛谷4139 bzoj 3884 上帝与集合的正确用法
  2. Linux记录-mysql参数优化
  3. 【水滴石穿】react-native-book
  4. Apache-Shiro-权限缓存
  5. 根据工作时间计算小组成员得分
  6. 第二节:垃圾回收期算法简介
  7. 【Android 界面效果10】Android中View,ViewGroup,Window之间的关系
  8. AT89C52编程开发源代码
  9. 在EXCEL中如何将一列中的相同值的数据行找出来?
  10. 学习Mysql命令行