希尔排序和归并排序(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大 ...
随机推荐
- C 中的typedef应用
1. typedef 声明的新的类型名在变量名的位置出现. example: typedef unsigned int UINT 则 unsigned int a; 相当于 UINT A; 2. t ...
- 《深入理解JAVA虚拟机》----------第三章 垃圾收集器与内存分配策略,笔记(下)
1.垃圾收集器 1.1 Serial收集器 这个收集器是一个单线程的收集器,它在进行垃圾收集时,必须暂停其他所有的工作线程. 它是虚拟机运行在Client模式下的默认新生代收集器,它简单而高效. 1. ...
- devmapper: Thin Pool has 162394 free data blocks which is less than minimum required 163840 free data blocks. Create more free space in thin pool or use dm.min_free_space option to change behavior
问题: 制作镜像的时候报错 devmapper: Thin Pool has 162394 free data blocks which is less than minimum required 1 ...
- linux配置虚拟域名
linux环境下面配置虚拟主机域名 第一步:在root目录下面(即根目录)ls(查看文件)cd进入etc目录find hosts文件vi hosts 打开hosts文件并进行编辑在打开的文件最下面添加 ...
- Spring启动异常: cvc-elt.1: Cannot find the declaration of element 'beans'(转)
Spring启动异常: cvc-elt.1: Cannot find the declaration of element 'beans' 2008-09-07 22:41 今天把在线聊天室代码改了下 ...
- scrapy 琐碎的东西
1.深度指定 DEPTH_LIMIT=1 2.常用命令 scrapy startproject name scrapy genspider name name.com scrapy crawl nam ...
- MySQL基本SQL语句之数据插入、删除数据和更新数据
一.INSERT插入数据: 方法一:批量插入 基本语法: INSERT INTO tb_name (col1, col2, ...) VALUES (val1, val2, ...)[,(val1, ...
- PTA 7-9 旅游规划(SPFA)
有了一张自驾旅游路线图,你会知道城市间的高速公路长度.以及该公路要收取的过路费.现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径.如果有若干条路径都是最短的,那么需要输出最便 ...
- PAT L2-013 红色警报(并查集求连通子图)
战争中保持各个城市间的连通性非常重要.本题要求你编写一个报警程序,当失去一个城市导致国家被分裂为多个无法连通的区域时,就发出红色警报.注意:若该国本来就不完全连通,是分裂的k个区域,而失去一个城市并不 ...
- PAT L2-011 玩转二叉树(二叉树层序遍历)
给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列.所谓镜面反转,是指将所有非叶结点的左右孩子对换.这里假设键值都是互不相等的正整数. 输入格式: 输入第一行给出 ...