归并排序
来源:互联网 发布:仙剑奇侠传5mac破解版 编辑:程序博客网 时间:2024/06/13 01:21
归并排序使用了分治思想,操作模式如下:
1 分解 分解待排序的n的元素成各具n/2个元素的两个数组2 解决 使用归并排序递归地排序两个数组3 合并 合并两个已排序的数组//上面的三个步骤会被递归调用
下面我们来看看合并步骤的伪代码
MERGE(A,p,q,r) // p<=q<r1 n1=q-p+12 n2=r-p3 let L[1..n1+1] and R[1..n2+1] be new arrarys4 for i=0 to n15 L[I]=A[p+i-1]6 for j=0 to n27 L[j]=A[q+j]8 L[n1+1]=∞9 L[n2+1]=∞10 i=111 j=112 for k=p to r14 if L[i]<=R[j]15 A[k]=L[i]16 i++17 else A[k]=R[j] j++
下面我们来看看排序的伪代码
MERGE-SORT(A,p,r)1 if p<r2 q(p+r)/23 MERGE-SORT(A,p,q)4 MERGE-SORT(A,q+1,r)5 MERGE(A,p,q,r)
Java 实现归并排序算法代码
import org.junit.Test;/** * Created by WuNanliang on 2017/5/6. */public class MergeSort { @Test public void test() { int[] arr = {1, 2, 3, 2, 1, 3, 45, 44, 55, 33, 54, 213, 6, 10}; mergeSort(arr, 0, arr.length - 1); for (int i : arr) System.out.print(" " + i); } /** * 归并排序 * * @param arr 待排序数组 * @param leftPos * @param rightPos */ private void mergeSort(int[] arr, int leftPos, int rightPos) { if (leftPos >= rightPos) return; int middlePos = (leftPos + rightPos) / 2; mergeSort(arr, leftPos, middlePos); mergeSort(arr, middlePos + 1, rightPos); merge(arr, leftPos, middlePos, rightPos); } /** * @param arr 数组 * @param left 左边界 * @param middle 待合并两个数组的分界 * @param right 右边界 */ private void merge(int[] arr, int left, int middle, int right) { int leftLen = middle - left + 1; int rightLen = right - middle; int[] leftArr = new int[leftLen]; int[] rightArr = new int[rightLen]; for (int i = 0; i < leftLen; i++) leftArr[i] = arr[left + i]; for (int j = 0; j < rightLen; j++) rightArr[j] = arr[middle + j + 1]; int l = 0, r = 0; int k = left; while (l < leftLen && r < rightLen) { if (leftArr[l] <= rightArr[r]) { arr[k] = leftArr[l]; l++; } else { arr[k] = rightArr[r]; r++; } k++; } //复制剩余的数组元素 while (l < leftLen) { arr[k] = leftArr[l]; l++; k++; } //复制剩余的数组元素 while (r < rightLen) { arr[k] = rightArr[r]; r++; k++; } }}
参考资料
《算法导论》
http://quiz.geeksforgeeks.org/merge-sort/
0 0
- 归并排序-归并排序
- 归并和归并排序
- 归并与归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 排序::归并
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- logistic regression(LR)对数几率回归 / 逻辑回归 公式推导
- threeJS开发day01-在画线的中间加上矩形
- 配置Android开发环境
- Python 3基础教程12-常见的错误
- WAMPServer随写笔记,变量
- 归并排序
- sqlserver还原备份问题
- POJ 2299 树状数组+离散化
- JavaScript对象---我们自己定义对象
- TensorFlow上实现卷积神经网络CNN
- java 保留小数后N位小数
- CTS测试环境搭建及简易步骤
- 第一章:嵌入式QT 开机启动画面
- 二叉树中和为某一值的路径