排序算法总结(4)——归并排序
来源:互联网 发布:搬瓦工vps搭建ss优化 编辑:程序博客网 时间:2024/05/22 12:58
归并排序的思想是把一个数组分成两半,排序每一半,然后把数组的两半归并成一个有序数组。
运用递归的方法,把每一半都分成两个四分之一,对每个四分之一排序,然后归并成有序的一半。
以此类推,反复的分割数组,直到子数组只含有一个数据项。
归并排序的一个缺点是它需要在存储器中申请一个大小等于被排序的数组,将排序后的数组存放到新申请的数组当中。若初始数组几乎沾满整个存储器,那么归并排序将不能工作。
代码如下:
public class MergeSort {private long[] theArray;private int nElemts;public void mergeSort(){long[] workspace=new long[nElemts];recMergeSort(workspace,0,nElemts-1);}public 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);}}private void merge(long[] workspace,int lowPtr,int highPtr,int upperBound){int j=0;int lowerBounder=lowPtr;int mid=highPtr-1;int n=upperBound-lowerBounder+1;while((lowPtr<=mid)&&(highPtr<=upperBound)){if(theArray[lowPtr]<theArray[highPtr]){workspace[j++]=theArray[lowPtr++];}else{workspace[j++]=theArray[highPtr++];}}//高半区元素已经完全并入数组while(lowPtr<=mid){workspace[j++]=theArray[lowPtr++];}//低半区元素已经完全并入数组while(highPtr<=upperBound){workspace[j++]=theArray[highPtr++];}for(j=0;j<n;j++){theArray[lowerBounder+j]=workspace[j];}}}
效率:
归并排序的运行时间为O(N*logN),
0 0
- 排序算法总结(4)——归并排序
- 排序算法总结——归并排序
- 排序算法总结(4)——归并排序、基数排序
- 排序算法—归并排序
- 排序算法—归并排序
- 排序算法总结(六)归并排序
- 排序算法总结(二)——快速排序、归并排序
- 排序算法总结之——归并排序
- 《排序算法》——归并排序,插入排序(Java)
- 排序算法(2)—归并排序,快速排序
- 常用排序算法总结(一)----冒泡排序,归并排序
- 算法-排序-归并排序和基数排序(排序总结)
- 【算法】排序算法(三)——归并排序
- 【算法总结】归并排序总结
- Java排序算法总结之(四)——归并排序
- 经典排序算法——归并排序
- 排序算法——归并排序
- 排序算法——归并排序
- ios学习路线—iOS高级(NSOperationQueue)
- 幻方算法
- leetcode题解日练--2016.6.19
- Property List Programming Guide(三)
- 构建高并发高可用的电商平台架构大纲
- 排序算法总结(4)——归并排序
- AliRedis单机180w QPS, 8台服务器构建1000w QPS Cache集群
- Android include标签的监听事件处理
- 快速排序算法
- NEUOJ 720 头哥的烦恼
- 主元素问题
- 原码、反码、补码知识详细讲解(此作者是我找到的讲的最细最明白的一个)
- java设计模式(十一)--状态模式
- C002-CPP-用malloc()存储任意长度的键入字符串