希尔排序和归并排序(java实现)
希尔排序
希尔排序算法实际上是一种特殊的插入排序,由DL.Shell于1959年提出而得名。
算法思想:希尔排序使数组中任意间隔为h的元素都是有序的,这些数组称为h有序数组,对于每个h,按插入排序进行排序。
算法实现:
public static void sort(int [] array){int h=1;while(h<array.length/3)h=3*h+1;while(h>=1){for(int i=h;i<array.length;i++){for(int j=i;j>=h&&array[j]<array[j-h];j=j-h){int temp=array[j];array[j]=array[j-h];array[j-h]=temp;}}h=h/3;}
分析:
然后执行h=h/3=1,即按插入排序对整个数组进行排序。此时倒置的元素很少,插入排序的效率大大提高。
归并排序
算法思想:基于分治的思想,将待排序的数组(递归的)分成两半,对这两部分分别排序,然后将结果归并起来。
算法实现(自顶向下递归实现):
public static int [] aux;public static void merge(int []array,int lo,int mid,int hi){//归并操作int i=lo,j=mid+1;for(int k=lo;k<=hi;k++){aux[k]=array[k];}for(int k=lo;k<=hi;k++){if(i>mid) array[k]=aux[j++];else if(j>hi) array[k]=aux[i++];else if(aux[j]<aux[i]) array[k]=aux[j++];else array[k]=aux[i++];}}public static void sort(int []array){aux=new int[array.length];sort(array,0,array.length-1);}public static void sort(int []array,int lo,int hi){if(hi<=lo) return ;int mid=lo+(hi-lo)/2;sort(array,lo,mid);sort(array,mid+1,hi);merge(array,lo,mid,hi);}
自底向上:
public static int [] aux;public static void merge(int []array,int lo,int mid,int hi){int i=lo,j=mid+1;for(int k=lo;k<=hi;k++){aux[k]=array[k];}for(int k=lo;k<=hi;k++){if(i>mid) array[k]=aux[j++];else if(j>hi) array[k]=aux[i++];else if(aux[j]<aux[i]) array[k]=aux[j++];else array[k]=aux[i++];}}public static void sort(int []array){aux=new int[array.length];for(int i=1;i<array.length;i=2*i){//两两进行合并for(int lo=0;lo<array.length-i;lo=lo+2*i){merge(array,lo,lo+i-1,Math.min(lo+2*i-1, array.length-1));}}}
时间复杂度为 Nlg(N)
转载于:https://www.cnblogs.com/coderising/p/5700831.html
希尔排序和归并排序(java实现)相关推荐
- 十大排序算法:冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序
冒泡排序.选择排序.插入排序.希尔排序.归并排序.快速排序.堆排序.计数排序.桶排序.基数排序的动图与源代码. 目录 关于时间复杂度 冒泡排序 选择排序 插入排序 希尔排序 归并排序 快速排序 堆排序 ...
- 掌握常见的内部排序方法(插入排序,冒泡排序,选择排序,快速排序,堆排序,希尔排序,归并排序,基数排序等)...
掌握常见的内部排序方法(插入排序,冒泡排序,选择排序,快速排序,堆排序,希尔排序,归并排序,基数排序等). 数组高级以及Arrays(掌握) 排序方法 空间复杂度 时间复杂度 稳定性 插 入 排 序 ...
- Python排序算法(二) 快速排序、希尔排序、归并排序
这篇文章有的排序算法是:快速排序.希尔排序.归并排序. 快速排序 ''' 快速排序 '''def quick_sort(aList, first, last):if first >= last: ...
- 希尔排序和归并排序以及快速排序
高级排序 高级排序 高级排序 1.希尔排序 2.归并排序 3.快速排序 4.快速排序和归并排序的区别 5.几种快速排序的测试 6.排序的稳定性 所谓高级排序就是在比时间复杂度上比简单排序更快一点,尤其 ...
- 【数据结构与算法】高级排序(希尔排序、归并排序、快速排序)完整思路,并用代码封装排序函数
本系列文章[数据结构与算法]所有完整代码已上传 github,想要完整代码的小伙伴可以直接去那获取,可以的话欢迎点个Star哦~下面放上跳转链接 https://github.com/Lpyexplo ...
- 十大经典排序算法(图解与代码)——冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序(Python and Java)
排序 重新排列表中的元素,使表中的元素按照关键字递增或者递减 内部排序: 指在排序期间,元素全部存放在内存中的排序 外部排序: 指在排序期间元素无法全部同时存放在内存中,必须在排序的过程中根据要求不断 ...
- 选择排序、冒泡排序、插入排序、快速排序、希尔排序、归并排序、堆排序和希尔排序的java实现比较
几种排序实现代码 package com.delicacy.oatmeal.test.suanfa.sort;import java.util.Arrays; import java.util.Ran ...
- ❤️万字总结八大排序:冒泡排序,选择排序,插入排序,堆排序,希尔排序,归并排序,计数排序❤️
目录 主要排序算法性能对比 冒泡排序 选择排序 插入排序 堆排序 希尔排序 快速排序 Hoare版 挖坑版 前后指针法 归并排序 计数排序 海量数据的排序问题 主要排序算法性能对比 冒泡排序 各位同学 ...
- 在路上---学习篇(一)Python 数据结构和算法 (4) --希尔排序、归并排序
独白: 希尔排序是经过优化的插入排序算法,之前所学的排序在空间上都是使用列表本身.而归并排序是利用增加新的空间,来换取时间复杂度的减少.这俩者理念完全不一样,注定造成的所消耗的时间不同以及空间上的不同 ...
最新文章
- ajax ie7没有权限,jquery ajax 在ie7不能正常使用
- 独家 | 一文读懂神经网络(附解读案例)
- Merge into 详细介绍
- linux_tomcat
- java继承与初始化
- Oracle 11.2.0.2新特性——用户重命名(Rename User)
- 【.NET Core项目实战-统一认证平台】第三章 网关篇-数据库存储配置(1)
- 一张图了解.Net Core和.NetFx和.Net Standard和Xamarin关系
- php error_get_last(),PHP捕获异常register_shutdown_function和error_get_last的使用
- linux扫盲之CPU模式
- 国内成品油价近期历次调整一览
- linux脚本怎么发送到桌面,如何在Linux上使用Zenity创建简单的图形Shell脚本
- (ISC)² 新增两家 CISSP 官方授权培训合作伙伴
- Redis集群原理和总结
- img pdf 展示_vue中如何实现pdf文件预览的方法
- html控制萤石云摄像头转动,怎么控制云台转动 ?
- gii无法访问 yii2_Gii的CURD生成无法访问?
- 尚硅谷springboot笔记
- Web Services 简介
- collections库
热门文章
- python定时启动代码_python每天定时运行某程序代码
- python类的继承代码_python--类的继承
- Xftp报no matching outgoing encryption algorithm found
- IntelliJ IDEA中使用sonar插件,忽略规则和重启规则
- UVa815 - Flooded!
- JavaScript浏览器window对象→简介、消息对话框、计时器、history、打开新窗口及模式showModalDialog、location、navigator、screen、窗口位置尺寸
- linux 编程 调度,Linux的进程线程及调度
- 各种手机处理器排行榜_11月新机性能排行榜:荣耀V30第四,vivo S5上榜
- 计算机组成原理—基本概念(不基础的部分)
- 网络地址转换协议NAT详解