归并排序(Merge Sort)
来源:互联网 发布:军人网络保密准则 编辑:程序博客网 时间:2024/05/16 12:57
基本思想:
归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。
归并排序示例:
合并方法:
设r[i…n]由两个有序子表r[i…m]和r[m+1…n]组成,两个子表长度分别为n-i +1、n-m。
- j=m+1;k=i;i=i; //置两个子表的起始下标及辅助数组的起始下标
- 若i>m 或j>n,转⑷ //其中一个子表已合并完,比较选取结束
- //选取r[i]和r[j]较小的存入辅助数组rf
如果r[i]<r[j],rf[k]=r[i]; i++; k++; 转⑵
否则,rf[k]=r[j]; j++; k++; 转⑵ - //将尚未处理完的子表中元素存入rf
如果i<=m,将r[i…m]存入rf[k…n] //前一子表非空
如果j<=n , 将r[j…n] 存入rf[k…n] //后一子表非空 - 合并结束。
归并的迭代算法
#include"iostream"using namespace std;void swap(int *a, int *b){int tmp = *a;*a = *b;*b = tmp;}void print(int arr[], int length){for(int i = 0; i < length; i ++){cout << arr[i] << " ";}cout << endl;}void Merge(int *arr, int *arr1, int start, int m, int end){int i, j, k;for(i = start, j = m + 1, k = i; i <= m && j <= end; k ++){if(arr[i] <= arr[j]){arr1[k] = arr[i];i ++;}else{arr1[k] = arr[j];j ++;}}while(i <= m){arr1[k] = arr[i];i ++;k ++;}while(j <= end){arr1[k] = arr[j];j ++;k ++;}for(int p = start; p <= end; p++){arr[p] = arr1[p];}}void Merge_Recursive(int *arr,int *arr1, int start, int end){if(start < end){int x = (start + end) / 2;Merge_Recursive(arr, arr1, start, x);Merge_Recursive(arr, arr1, x + 1, end);Merge(arr, arr1, start, x, end);cout << endl;print(arr, 10);}}void MergeSort(int arr[], int arr1[], int length){Merge_Recursive(arr, arr1, 0, length - 1);}int main(){int arr[10] = {8, 7, 5, 4, 3, 0, 2, 1, 9, 6};int arr1[10] = {2,1,9,6};print(arr, 10);MergeSort(arr, arr1, 10);//QuickSort(arr, 0, 9);//print(arr, 4);int k = 0;cin >> k;}
归并的迭代算法
0 0
- 归并排序(merge sort)
- 归并排序(merge sort)
- 归并排序(merge sort)
- 归并排序(Merge Sort)
- 归并排序(merge sort)
- 归并排序(merge sort)
- Merge Sort (归并排序)
- 归并排序(Merge sort)
- 归并排序(Merge sort)
- 归并排序(Merge Sort)
- 归并排序(Merge Sort)
- 归并排序(Merge Sort)
- 归并排序(Merge Sort)
- 归并排序(Merge Sort)
- 归并排序(MERGE-SORT)
- 归并排序(Merge Sort)
- 归并排序(Merge Sort)
- 归并排序(Merge Sort)
- MySQL 高可用:主从配置或主主(双主)配置
- RecyclerView设置Item点击事件
- 关于微博的正文的整个思维逻辑 (含有只有图片数量计算图片九宫格算法)
- 百度云下载速度慢解决方案(仅供参考,大神请指导)
- 黑马程序员---成长之路-----OC之基础篇MRC内存管理
- 归并排序(Merge Sort)
- 关于学习编程
- 【我的问题】没解决的问题
- lintcode-中序遍历和后序遍历树构造二叉树-72
- lintcode- 前序遍历和中序遍历树构造二叉树-73
- 黑马程序员---成长之路-----OC之基础篇ARC和类别
- opencv3.0使用过程中出现“无法定位程序输入点”问题
- 三目表达式的运用
- JAVA设计模式(工厂模式)