分治法——归并排序
来源:互联网 发布:冒泡排序法c语言讲解 编辑:程序博客网 时间:2024/05/29 18:00
分治法:将原问题划分成n个规模较小而结构与原问题相似的子问题,递归的解决这些子问题,然后再合并其结果,就得到原问题的解。
步骤:分解-》解决-》合并。
归并排序算法分析:
这里我们有一个长度为8的数组,元素为{3,1,5,2,4,99,88,7};
1、分解,把原数组划分成n个相似的子问题,划分结果如图所示:
2、解决子问题:对每个小的数组进行合并,即(1,3)(2,5)(4,99)(7,8)
3、合并子问题:(1,2,3,5)(4,7,8,99)–》(1,2,3,4,5,7,8,99)**
时间复杂度分析:
N 为数组长度,N = 1是,T(N) = C; (C代表规模为1的问题所需时间)
分解子问题复杂度为:T(N) = 2T(N/2) + CN = 2NlgN + CN = NlgN(N > 1)
算法稳定性:稳定
#include <iostream>using namespace std;void MergeSort(int* A, int lIndex, int rIndex);void Merge(int* A, int lIndex, int mIndex, int rIndex);int main (){ int arr[] = {3,1,5,2,4,99,8,7}; int len = sizeof(arr)/sizeof(int); MergeSort(arr, 0, len-1); for (int i = 0; i < len; ++i) { cout << arr[i] << "\t"; } cout << endl; return 0;}void MergeSort(int* A, int lIndex, int rIndex){ if (A == NULL || lIndex >= rIndex) { return; } int midIndex = (lIndex + rIndex) / 2; MergeSort(A, lIndex,midIndex); MergeSort(A, midIndex+1, rIndex); Merge(A, lIndex, midIndex, rIndex);}void Merge(int* A, int lIndex, int mIndex, int rIndex){ if (A == NULL || lIndex > mIndex || mIndex > rIndex) { return; } int iLengthL = mIndex - lIndex + 1; int* L = new int[iLengthL]; for (int i = 0; i < iLengthL; ++i) { L[i] = A[lIndex + i]; } int iLengthR = rIndex - mIndex; int* R = new int[iLengthR]; for (int i = 0; i < iLengthR; ++i) { R[i] = A[mIndex + i + 1]; } int startL = 0; int startR = 0; int startA = lIndex; while (1) { if (L[startL] <= R[startR]) { A[startA++] = L[startL++]; if (startL == iLengthL) { break; } } else { A[startA++] = R[startR++]; if (startR == iLengthR) { break; } } } while (startL != iLengthL) { A[startA++] = L[startL++]; } while(startR != iLengthR) { A[startA++] = R[startR++]; } delete L; delete R;}
0 0
- 分治法—归并排序
- 分治法——归并排序
- 分治法算法——归并排序
- 分治法——归并排序
- 分治归并——排序
- 分治——归并排序
- 分治策略—归并排序
- 分治法,归并排序
- 分治法-归并排序
- 分治法-归并排序
- 归并排序-分治法
- 分治法 - 归并排序
- 分治法--归并排序
- 归并排序 分治法
- 归并排序--分治法
- 分治法 & 归并排序
- 分治法-归并排序
- 分治法-归并排序
- Codeforces 540B School Marks 【贪心构造】
- CentOS 7 配置163源
- HDU 4506 小明系列故事——师兄帮帮忙(快速幂)
- 怎么在mac终端上执行R脚本
- html5中链接和分组标签
- 分治法——归并排序
- Kiss you goodbye
- Prim算法
- leetcode:Best Time to Buy and Sell Stock II 【Java】
- C++面向对象高级编程笔记01--GeekBand
- mybatis脱离其他框架,利用main或者junit测试代码
- hihoCoder#1032 : 最长回文子串(manacher算法)
- kidd风的IOS日志之地图与定位
- SQL读书笔记(九) UNION