希尔排序

希尔排序算法实际上是一种特殊的插入排序,由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实现)的更多相关文章

  1. 几种排序方式的java实现(02:希尔排序,归并排序,堆排序)

    代码(部分为别人代码): 1.希尔排序(ShellSort) /* * 希尔排序:先取一个小于n的整数d1作为第一个增量, * 把文件的全部记录分成(n除以d1)个组.所有距离为d1的倍数的记录放在同 ...

  2. Java冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序

    冒泡排序   冒泡排序是一种简单的排序算法.它重复地走访过要排序地数列,一次比较两个元素,如果它们地顺序错误就把它们交换过来.走访数列地工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成. ...

  3. Python 一网打尽<排序算法>之从希尔排序算法的分治哲学开始

    1. 前言 本文将介绍希尔排序.归并排序.基数排序(桶排序).堆排序. 在所有的排序算法中,冒泡.插入.选择属于相类似的排序算法,这类算法的共同点:通过不停地比较,再使用交换逻辑重新确定数据的位置. ...

  4. 几种常见排序算法之Java实现(插入排序、希尔排序、冒泡排序、快速排序、选择排序、归并排序)

    排序(Sorting) 是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个关键字有序的序列. 稳定度(稳定性)一个排序算法是稳定的,就是当有两个相等记录的关 ...

  5. 牛客网Java刷题知识点之插入排序(直接插入排序和希尔排序)、选择排序(直接选择排序和堆排序)、冒泡排序、快速排序、归并排序和基数排序(博主推荐)

    不多说,直接上干货! 插入排序包括直接插入排序.希尔排序. 1.直接插入排序: 如何写成代码: 首先设定插入次数,即循环次数,for(int i=1;i<length;i++),1个数的那次不用 ...

  6. 排序基础之归并排序、快排、堆排序、希尔排序思路讲解与Java代码实现

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6594855.html  一:归并排序==通过中间值进行左右划分递归,然后调用合并函数对左右递归的结果进行合并( ...

  7. 9, java数据结构和算法: 直接插入排序, 希尔排序, 简单选择排序, 堆排序, 冒泡排序,快速排序, 归并排序, 基数排序的分析和代码实现

    内部排序: 就是使用内存空间来排序 外部排序: 就是数据量很大,需要借助外部存储(文件)来排序. 直接上代码: package com.lvcai; public class Sort { publi ...

  8. 程序员必知的8大排序(四)-------归并排序,基数排序(java实现)

    程序员必知的8大排序(一)-------直接插入排序,希尔排序(java实现) 程序员必知的8大排序(二)-------简单选择排序,堆排序(java实现) 程序员必知的8大排序(三)-------冒 ...

  9. 程序员必知的8大排序(一)-------直接插入排序,希尔排序(java实现)

    http://blog.csdn.net/pzhtpf/article/details/7559896 程序员必知的8大排序(一)-------直接插入排序,希尔排序(java实现) 程序员必知的8大 ...

随机推荐

  1. C#中的 new Random()

    在C#中,产生随机数常用大方法是 new Random().Next(1,10)等方法. 但是仔细发现会有个问题: 看代码: ; i < ;i++ ) { Console.WriteLine(, ...

  2. php数组按值的大小排序

    array_multisort(array_column($nima,'zongfen'),SORT_DESC,$nima);

  3. 自定义sql server 聚合涵数

    using System; using System.Data; using System.Data.SqlClient; using System.Data.SqlTypes; using Micr ...

  4. 二、Blender/Python API总览

    原文:https://docs.blender.org/api/blender_python_api_current/info_overview.html Python in Blender  Ble ...

  5. Django 常见错误总结

    1,在 Django 的框架中,从view中对文本文档进行处理的过程中,发现总是找不到对应的 .txt 文件,而在同级目录下面的 tests.py(自己新建的 py 文件)中却能找到,后来发现还是路径 ...

  6. GIT 命令集

    Git图形化界面 下面是我整理的常用 Git 命令清单.几个专用名词的译名如下. Workspace:工作区 Index / Stage:暂存区 Repository:仓库区(或本地仓库) Remot ...

  7. jenkins搭建自动化部署平台(svn+tomcat重启)

    原文链接:http://blog.csdn.net/zjs40/article/details/51818322 jenkins 自动化部署和集成代码的平台 可以将Git svn 上的代码 check ...

  8. vm 克隆一台新机器启动网卡报错:device eth0 does not seem to be present, delaying initialization

    解决方案: 1. vi /etc/sysconfig/network-scripts/ifcfg-eth0 ifcfg-eth0的配置文件里保存了以前的MAC地址,就把这一行删除掉在重启网卡   2. ...

  9. python中matplotlib所绘制的图包含了很多的对象

    上图中的top=‘off’意思是说顶部的grid lines 看不见. 去除frame,意思就是将这个矩形给去除掉,spine意思是脊柱 bars = plt.bar(pos, popularity, ...

  10. numpy学习之矩阵之旅

    一:特殊的矩阵 1.全0全1的矩阵 2.单位矩阵 单位矩阵:整个矩阵是n*n的,并且斜对角全是1 矩阵的加减法 1.矩阵相加,相减必须要有相同的行和列 二:数组的乘法(点成) 数组的乘法 list_1 ...