分治法——归并排序(MergeSort)
来源:互联网 发布:苹果电脑双系统卸载mac 编辑:程序博客网 时间:2024/05/21 14:03
分治法的思想:将原问题分解为几个规模较小单类似于原问题的子问题,递归地求解这些子问题,然后再合并这些子问题来建立原问题的解。
分治法法在每层递归时都有如下三个步骤:
- 分解原问题为若干子问题,这些子问题是原问题的规模较小的实例
- 解决这些子问题,递归求解子问题
- 合并这些子问题的解成原问题的解
归并排序完全遵循分治法:将待排序的具有n个元素的序列分别分解为含有n/2个元素的子序列。使用归并排序递归地排序两个子序列。最后合并两个已排序的子序列来产生已排序的答案。
下面是归并排序的代码:
void merge_sort(int a[],int num){ int *temp = new int[num]; if(temp == NULL) return ; MergeSort(a, 0, number - 1, temp); delete[] temp;}void MergeSort(int a[], int first, int last, int temp[]){ int mid = 0; if(first < last) { mid = (first + last) / 2; MergeSort(a, first, mid, temp);//左边有序 MergeSort(a, mid + 1, last, temp);//右边有序 merge(a, first, mid, last, temp);//合并成一个有序序列 }}//将两个有序数列合并void merge(int a[], int first, int mid, int last, int temp[]){ int i = first, j = mid + 1; int m = mid, n = last; int k = 0; while(i <= m && j <= n) { if(a[i] <= a[j]) temp[k++] = a[i++]; else temp[k++] = a[j++]; } while(i <= m) temp[k++] = a[i++]; while (j <= n) temp[k++] = a[j++]; for(i = 0; i < k; i++) a[first + i] = temp[i];}
1 0
- 分治法——归并排序(MergeSort)
- 【从零学习经典算法系列】分治策略实例——归并排序(Mergesort)
- 归并排序(MergeSort)
- 归并排序(MergeSort)
- 归并排序(MergeSort)
- 归并排序(MergeSort)
- 归并排序(Mergesort)
- 归并排序(MergeSort)
- 归并排序(mergeSort)
- 归并排序(MergeSort)
- 归并排序(mergesort)
- 分治法—归并排序
- 合并(归并)排序(MergeSort)
- MergeSort -- 归并排序(C++)
- Java 归并排序(MergeSort)
- Java 归并排序(MergeSort)
- 分治法——归并排序
- 分治法算法——归并排序
- 通过代码 新增 和 “修改”NSLayoutConstraint
- 安装好 ubuntu要做的几件事
- 三角形问题
- onNewIntent()方法何时会被调用
- 集体智慧学习编程—— 学习笔记一
- 分治法——归并排序(MergeSort)
- 使用ViewPagerIndicator结合ViewPager实现网易新闻客户端的Tab标签效果
- 多线程编程(二)——线程结束后的处理&主服务存活方法
- _free_base 崩溃
- jquery ajax
- camp day2
- Android Notification.setLatestEventInfo弃用和Notification.Builder用法
- leetcode303-Range Sum Query - Immutable
- poj 1797 Heavy Transportation(通路中的最大承载量)