java递归浅析合并排序
来源:互联网 发布:好乐宝软件下载 编辑:程序博客网 时间:2024/05/29 14:30
基本思想:
合并排序的递归方式是基于分治思想的一个实例,分治把一个复杂问题给分解成各个子问题,通过求解这些简单的子问题,最后合成各个子问题的解实现初始问题的求解;同样,合并算法把一个数组对半两个子数组,然后对两个子数组进行排序,递归调用排序过程;性能
- 最坏情况下时间复杂度:Θ(nlogn)
- 最好情况下时间复杂度:Θ(nlogn)
- 平均情况下时间复杂度:Θ(nlogn)
- 最坏情况下空间复杂度:Θ(n) 辅助
public static void mergeSort(int[] list,int[] array,int left,int mid,int right) { int k=left,//新array数组的初始化,即初始化下标 i=left,//list数组的下标 j=mid+1; //将两个待排数组放入到新的数组中arra[],直到某一方的待排数组耗尽即可停止循环 while(i<=mid&&j<=right)//设定边界值。左边数组的下标小于等于最大长度mid { if(list[i]<=list[j])//左半部分进行比较 { array[k++]=list[i++]; } else //右半部分进行比较 { array[k++]=list[j++]; } } // 考虑某个数组剩余数的情况 if(i>mid)//左指针已经大于中间点 { //假如左边数组耗尽,说明右边数组还有剩余数 for(int t=j;t<=right;t++) { array[k++]=list[t];//继续把剩余数组放入新数组中 } } else { //假如右边数组耗尽,说明左边数组还有剩余数 for( int t=i;t<=mid;t++) { array[k++]=list[t]; } } } public static void copy(int[] list,int[] array,int le,int r){ for(int i=le;i<=r;i++) { list[i]=array[i]; } } public static void digui(int[] list,int left,int right){ int[] b=new int[list.length];//创建一个新的数组b if(left<right) { int mid=(left+right)/2; digui(list,left,mid);//左边排序 digui(list,mid+1,right);//右边排序 mergeSort(list,b,left,mid,right); copy(list,b,left,right); } }
分析:
合并排序将输入序列分成两部分并递归处理每一部分。当子问题解决后,算法又将子问题解合并。假设具有n个元素的合并排序的复杂度表示为T(n),则合并排序的递归式可定义为:
T(n)=2T(n/2)+Θ(n)
根据分治法注定理,有T(n)=Θ(nlogn)
阅读全文
0 0
- java递归浅析合并排序
- JAVA 合并排序(递归算法)
- 递归的合并排序
- 递归合并排序
- 递归合并排序
- 非递归合并排序
- 递归合并排序
- 非递归合并排序
- 递归实现合并排序
- 递归之合并排序
- 合并排序(递归)
- 合并排序-递归分治
- 合并排序-非递归
- 递归分治算法之合并排序(Java版本)
- 自然合并排序的java实现(合并排序的非递归实现)
- 合并排序算法(非递归)
- 合并排序(非递归算法)
- 非递归实现合并排序
- 杭电1001 Sum Problem
- 算法笔记:使用栈实现汉诺塔(Hanoi)经典算法
- 垃圾收集与分配策略——(三)HotSpot的算法实现
- Java注解
- QWT的配置和使用(1)
- java递归浅析合并排序
- 杭电1002 A + B Problem II
- 机器学习之旅:数据预处理的对象-数据
- C++常成员函数和常对象、对象指针和对象引用
- C++11基础-----std::function & std::bind
- 内存中的堆和栈
- java语言基础(98)——定时器和定时任务
- hbase学习教程(三):HBase优化技巧、HBase基本命令、使用Java API对HBase服务器进行操作
- 杭电1003 Max Sum