归并排序
来源:互联网 发布:java写入txt文件 编辑:程序博客网 时间:2024/06/16 03:16
思路: 将存有较多数据的数组,拆分成两个数组,分别排序后,将有序的两个数组合并。合并前递归拆分的过程,直至只有一个元素后,逐级合并。
实现:
package com.test;/** * 归并排序 * @author xurongsheng * @date 2017年4月14日 上午11:22:25 * */public class MergeSort {private long[] target;//待排序数据public MergeSort(){}public MergeSort(int maxLength){target = new long[maxLength];}public void setTargetValue(int index,long value){target[index] = value;}public long getTargetValue(int index){return target[index];}public void display(){System.out.print("A=");for (int i = 0; i < target.length; i++) {System.out.print(target[i]+" ");}System.out.println(" ");}/** * 归并排序 * 时间复杂度: O(nlogN) * @author xurongsheng * @date 2017年4月14日 下午3:32:10 */public void mergeSort(){long[] workSpace = new long[target.length];recMergeSort(workSpace,0,target.length-1);}/** * 归并 * @author xurongsheng * @date 2017年4月14日 上午11:33:29 * @param workSpace * @param lowerBound * @param upperBound */private void recMergeSort(long[] workSpace,int lowerBound,int upperBound){if(lowerBound == upperBound){ //只有一个元素,无需排序return;}else{int mid = (lowerBound+upperBound)/2; //中间项recMergeSort(workSpace,lowerBound,mid); //排序左侧项recMergeSort(workSpace,mid+1,upperBound); //排序右侧项merge(workSpace,lowerBound,mid+1,upperBound);}}/** * 合并两个有序数组 * @author xurongsheng * @date 2017年4月14日 下午2:12:16 * @param workSpace * @param lowPtr * @param highPtr * @param upperBound */private void merge(long[] workSpace,int lowPtr,int highPtr,int upperBound){int j = 0; //int lowerBound = lowPtr;int mid = highPtr - 1;int n = upperBound - lowerBound + 1;while(lowPtr <= mid && highPtr <= upperBound){if(target[lowPtr] < target[highPtr]){workSpace[j++] = target[lowPtr++];}else{workSpace[j++] = target[highPtr++];}}while(lowPtr <= mid){workSpace[j++] = target[lowPtr++];}while(highPtr <= upperBound){workSpace[j++] = target[highPtr++];}for(j = 0; j
效率: 归并排序的时间复杂度为 O(n*logN) 最好、最坏、平均情况下都是O(n*logN) logN为以2为底N的对数
由于计算过程中需要一个长度为n的临时空间,故 空间复杂度为O(N)
0 0
- 归并排序-归并排序
- 归并和归并排序
- 归并与归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 排序::归并
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- lua之基本函数
- 实现web启动时加载指定方法
- 【OpenGL】OpenGL系列——07帧缓存操作
- 学习Javascript闭包(Closure)
- Flink实现WordCount
- 归并排序
- 多线程基础部分小结
- 笔试面试算法经典--数组partition调整使数组的左部分单调有序
- 使用java理解程序逻辑第十一章
- UVA11582 Colossal Fibonacci
- Android异步----重新认识Android(6)
- 【OpenGL】OpenGL系列——08绘制曲面与查询函数
- git制作和提交patch
- 地图开发——腾讯地图混淆::app:shrinkReleaseMultiDexComponents