《算法导论》二分法排序
来源:互联网 发布:触摸屏查询网站源码 编辑:程序博客网 时间:2024/05/18 15:56
今晚上看到了分治法,就是俗称的二分法。算法代码如下:
static public void MergeSortAsc(ref int[] arr, int p, int r) { if (p < r) { int q = (p + r) / 2; MergeSortAsc(ref arr, p, q); MergeSortAsc(ref arr, q + 1, r); MergeAsc(ref arr, p, q, r); } } static public void MergeAsc(ref int[] arr, int p, int q, int r) { int leftLength = q - p+1; int[] leftArr = new int[leftLength + 1]; for (int i = 0; i < leftLength; i++) { leftArr[i] = arr[p+i]; } leftArr[leftLength] = int.MaxValue; int rightLength = r - q; int[] rightArr = new int[rightLength + 1]; for (int i = 0; i < rightLength; i++) { rightArr[i] = arr[q + i + 1]; } rightArr[rightLength] = int.MaxValue; int left = 0; int right = 0; for (int i = p; i <= r; i++) { if (leftArr[left] < rightArr[right]) { arr[i] = leftArr[left]; left++; } else { arr[i] = rightArr[right]; right++; } } }
如果需要降序的话, 将leftArr[leftLength] = int.MaxValue和rightArr[rightLength] = int.MaxValue,分别改成 leftArr[leftLength] = int.MinValue和rightArr[rightLength] = int.MinValue,然后 leftArr[left] < rightArr[right] 改为leftArr[left] > rightArr[right]。
分析时间复杂度:
当n=1时,
当n>1时,
下面修改的一种,节约了一些空间占用。
static public void MergeSortAsc(ref int[] arr, int p, int r) { if (p < r) { int q = (p + r) / 2; MergeSortAsc(ref arr, p, q); MergeSortAsc(ref arr, q + 1, r); MergeAsc_Change_01(ref arr, p, q, r); } } static public void MergeAsc_Change_01(ref int[] arr, int p, int q, int r) { int leftLength = q - p + 1; int[] leftArr = new int[leftLength]; for (int i = 0; i < leftLength; i++) { leftArr[i] = arr[p + i]; } int rightLength = r - q; int[] rightArr = new int[rightLength]; for (int i = 0; i < rightLength; i++) { rightArr[i] = arr[q + i + 1]; } int left = 0; int right = 0; for (int i = p; i <= r; i++) { if (left == leftLength) { arr[i] = rightArr[right]; right++; continue; } if (right == rightLength) { arr[i] = leftArr[left]; left++; continue; } if (leftArr[left] < rightArr[right]) { arr[i] = leftArr[left]; left++; } else { arr[i] = rightArr[right]; right++; } } }
0 0
- 《算法导论》二分法排序
- 二分法排序算法
- 算法学习-二分法排序
- 排序算法练习-二分法
- 一头扎进算法导论-二分法思想改进插入排序O(nlog2(n))
- 排序算法 -- 二分法插入排序
- 排序算法:二分法插入排序
- 算法导论2.3-5二分法查找问题
- 一头扎进算法导论-二分法查找
- 《算法导论》排序算法
- 《算法导论》排序算法
- Python实现冒泡排序、选择排序、插入排序、快速排序、归并排序、二分法查找算法(基于《算法导论》伪代码)
- 排序算法之 二分法查找
- 快速排序,二分法排序,插入排序算法
- 算法导论:插入排序
- 算法导论 堆排序
- 算法导论 计数排序
- 【算法导论】拓扑排序
- afshdmjnedhf
- netty源码分析之ChannelPipeline
- netty源码分析系列文章
- 2014 BUAA 选拔赛第一场
- 【LeetCode】4Sum
- 《算法导论》二分法排序
- JavaScript Closure
- jquery中后代元素和子元素的区别
- [LeetCode55]Jump Game
- Mysql中如何将时间戳转化为常用日期格式
- [C/C++]常见错误积累
- 【LeetCode】Remove Nth Node From End of List
- [LeetCode45]Jump Game II
- html压缩工具html-minifier -- nodejs常用模块(4)