希尔排序和归并排序(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)
希尔排序和归并排序(java实现)的更多相关文章
- 几种排序方式的java实现(02:希尔排序,归并排序,堆排序)
代码(部分为别人代码): 1.希尔排序(ShellSort) /* * 希尔排序:先取一个小于n的整数d1作为第一个增量, * 把文件的全部记录分成(n除以d1)个组.所有距离为d1的倍数的记录放在同 ...
- Java冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序
冒泡排序 冒泡排序是一种简单的排序算法.它重复地走访过要排序地数列,一次比较两个元素,如果它们地顺序错误就把它们交换过来.走访数列地工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成. ...
- Python 一网打尽<排序算法>之从希尔排序算法的分治哲学开始
1. 前言 本文将介绍希尔排序.归并排序.基数排序(桶排序).堆排序. 在所有的排序算法中,冒泡.插入.选择属于相类似的排序算法,这类算法的共同点:通过不停地比较,再使用交换逻辑重新确定数据的位置. ...
- 几种常见排序算法之Java实现(插入排序、希尔排序、冒泡排序、快速排序、选择排序、归并排序)
排序(Sorting) 是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个关键字有序的序列. 稳定度(稳定性)一个排序算法是稳定的,就是当有两个相等记录的关 ...
- 牛客网Java刷题知识点之插入排序(直接插入排序和希尔排序)、选择排序(直接选择排序和堆排序)、冒泡排序、快速排序、归并排序和基数排序(博主推荐)
不多说,直接上干货! 插入排序包括直接插入排序.希尔排序. 1.直接插入排序: 如何写成代码: 首先设定插入次数,即循环次数,for(int i=1;i<length;i++),1个数的那次不用 ...
- 排序基础之归并排序、快排、堆排序、希尔排序思路讲解与Java代码实现
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6594855.html 一:归并排序==通过中间值进行左右划分递归,然后调用合并函数对左右递归的结果进行合并( ...
- 9, java数据结构和算法: 直接插入排序, 希尔排序, 简单选择排序, 堆排序, 冒泡排序,快速排序, 归并排序, 基数排序的分析和代码实现
内部排序: 就是使用内存空间来排序 外部排序: 就是数据量很大,需要借助外部存储(文件)来排序. 直接上代码: package com.lvcai; public class Sort { publi ...
- 程序员必知的8大排序(四)-------归并排序,基数排序(java实现)
程序员必知的8大排序(一)-------直接插入排序,希尔排序(java实现) 程序员必知的8大排序(二)-------简单选择排序,堆排序(java实现) 程序员必知的8大排序(三)-------冒 ...
- 程序员必知的8大排序(一)-------直接插入排序,希尔排序(java实现)
http://blog.csdn.net/pzhtpf/article/details/7559896 程序员必知的8大排序(一)-------直接插入排序,希尔排序(java实现) 程序员必知的8大 ...
随机推荐
- Java模板引擎之freemarker简介
- JAVA语言 第七周
啊因为来学校了,没有网,昨天的总结今天来写吧. num1=In.next(); student1[number].stuNum=num1; 这个添加的代码,显示添加成功了,但是根本查询不出来,烦 ...
- Github好桑心,慢慢来吧,等待中
等了大半天还是没办法注册,在线求助...
- js判断是否为undefined
typeof(isadmin)=="undefined"需要使用typeof才能判断
- JDK各个版本比较 JDK5~JDK10
JDK1.5新特性: 1.自动装箱与拆箱: 2.枚举 3.静态导入,如:import staticjava.lang.System.out 4.可变参数(Varargs) 5.内省(Introspec ...
- Computed property names
[Computed property names] That allows you to put an expression in brackets [], that will be computed ...
- Ajax图片异步上传并回显
1.jsp页面 <td width="20%" class="pn-flabel pn-flabel-h"></td> <td w ...
- python3 文件读写,编码错误UnicodeDecodeError
问题:python3 with open文件进行读写,报编码错误 /usr/local/Cellar/python3/3.5.2/Frameworks/Python.framework/Version ...
- 【C++】预处理过程与语句总结
转载请保留: http://www.cnscn.org(CNS电脑与英语学习网) Author: cnscn http://www.cnscn.org 1)预处理 根据已放置在文件中的预处理指令来修改 ...
- Jboss 数据源密码明文加密
转载:https://blog.csdn.net/iberr/article/details/40896479 备注:解密小程序没有测试,知识了解了加密解密过程.对自己的帮助是看懂了连接数据库的配置, ...