希尔排序

希尔排序算法实际上是一种特殊的插入排序,由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. SQL Server Assembly (SQL CLR) 还原数据库后的问题

    最近弄项目迁移的时候遇到还原数据库(SQL Server 2008)后遇到的一个问题: 消息 10314,级别 16,状态 11,第 1 行 在尝试加载程序集 ID 65536 时 Microsoft ...

  2. 3D模板阴影原理

    3D模板阴影原理 1:先从3dsMax中导出一个简单的场景,一个园环,球,平面. 2:园环直接面向光源,园环对球体来说是一个光线的阻挡物,园环在它上面形成阴影,同时,园环和球体对平面来说是光线的阻挡物 ...

  3. idea git 从github上拉取项目 更改上传

    更改上传: 新增文件上传时注意:

  4. 吴裕雄 04-mysql创建数据库

    ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'admin'; CREATE DATABASE 数据库名 ...

  5. 吴裕雄 python神经网络 花朵图片识别(10)

    import osimport numpy as npimport matplotlib.pyplot as pltfrom PIL import Image, ImageChopsfrom skim ...

  6. 04_web基础(八)之车票实现增删改查初级版本

    43.web页面显示车票列表简略完成 代码: 控制层代码 package com.day03.station.controller; import com.day03.station.model.Ti ...

  7. War3编辑器

    [War3编辑器] 1.英雄在商店买东西叫“任意单位 出售物品”,英雄卖东西给商店叫“抵押物品”. 2.触发器中的一级窗口包含: 1)设置事件窗口. 2)设置条件窗口. 3)设置动作窗口. 3.二级设 ...

  8. maven项目下出现java.lang.ClassNotFoundException: ContextLoader异常

    原因:出现此异常是因为tomcat的webapp目录下没有lib文件. 解决方案: 1.右键点击项目--选择Properties选择Deployment Assembly,在右边点击Add按钮,在弹出 ...

  9. NDK环境搭建方法2

    1.新建项目NDKDemo3 2.新建com.example.shixm.ndkdemo3.MyNdk.java 3.右键main文件夹,New->Folder->JNI Folder 4 ...

  10. Python 学习笔记---爬取海贼王动漫

    最近无聊整理的爬虫代码,可以自动爬取腾讯动漫的任意漫画,思路如下: 1. 先获取想下载的动漫url, 这里用了 getUrls ,直接获取动漫的最后一章 2. 然后进入到该动漫去获取要下载的图片url ...