Life

Sunday, September 30, 2018

希尔排序

基本概念

希尔排序是一种基于插入排序的快速排序算法,希尔排序的时间复杂度和其增量序列有关系,并无确定值。希尔排序的空间复杂度是O(1),即属于就地排序,希尔排序属于不稳定的排序。

算法思想

将无序数组分割为若干个子序列,子序列不是逐段分割的,而是相隔特定的步长的子序列,对各个子序列进行插入排序;然后再选择一个更小的步长,再将数组分割为多个子序列进行排序……最后选择步长为1,即使用直接插入排序,使最终数组成为有序。

算法描述

我们用一个例子来描述希尔排序的过程:
给出一无序数组:5, 3, 6, 2, 1, 7, 9, 8, 0, 4
取步长为5,将数组划分为5个子数组。为使读者明白,在这里采用[下标]-值的形式表示:
第一个子数组:[0]-5 , [5]-7
第二个子数组:[1]-3 , [6]-9
第三个子数组:[2]-6 , [7]-8
第四个子数组:[3]-2 , [8]-0
第五个子数组:[4]-1 , [9]-4
对这五个数组分别进行插入排序,排序后的结果:
[0]-5 , [5]-7
[1]-3 , [6]-9
[2]-6 , [7]-8
[3]-0 , [8]-2
[4]-1 , [9]-4
合并起来就是: 5,3,6,0,1,7,9,8,2,4
第二次取步长为5-1=4,可划分为四个子数组:
第一个子数组:[0]-5 , [4]-1 , [8]-2
第二个子数组:[1]-3 , [5]-7 , [9]-4
第三个子数组:[2]-6 , [6]-9
第四个子数组:[3]-0 , [7]-8
再次对每个子数组进行插入排序,排序结果:
[0]-1 , [4]-2 , [8]-5
[1]-3 , [5]-4 , [9]-7
[2]-6 , [6]-9
[3]-0 , [7]-8
合并后为:1,3,6,0,2,4,9,8,5,7
依次类推
第三次取步长为3,排序后为:0 ,2 ,4, 1, 3 ,5, 7 ,8 ,6 ,9 
第四次取步长为2,排序后为:0 ,1 ,3 ,2, 4 ,5 ,6, 8, 7, 9 
第五次取步长为1,排序后为:0 ,1 ,2, 3 ,4 ,5 ,6 ,7 ,8 ,9

算法实现



package test;
/**
 * Title:ShellSort
 * Description:希尔排序
 * @author LeslieTian
 * @date   2018-9-29 下午5:06:59
 * @version 1.0
 */
public class ShellSort {
    public  static void shellSort(int[] arr){
     int h = arr.length/2;//初始步长取排序数组长度的一半
     if(h==0){
      return;
     }
     while(h>=1){
      for(int i = h; i < arr.length;i++){
       for(int j = i; j >= h && arr[j] < arr[j-h];j -= h){
        swap(arr,j,j-h);
       }
      }
      System.out.print("步长为" +h+ ": ");//输出一次循环后的数组
      for(int word : arr){
       System.out.print(word + " ");
      }
      System.out.println("\n");
      h -= 1;
     }//while
    }//method-shellSort
    
    public static void swap(int arr[],int x,int y){
     int temp;
     temp = arr[x];
     arr[x] = arr[y];
     arr[y] = temp;
    }
 
 public static void main(String[] args) {
       int arr[]= {5,3,6,2,1,7,9,8,0,4} ;
       shellSort(arr);
 }
}
运行结果:

步长为5: 5 3 6 0 1 7 9 8 2 4 

步长为4: 1 3 6 0 2 4 9 8 5 7 

步长为3: 0 2 4 1 3 5 7 8 6 9 

步长为2: 0 1 3 2 4 5 6 8 7 9 

步长为1: 0 1 2 3 4 5 6 7 8 9
版权声明
本博客所有的原创文章,作者皆保留版权。转载必须包含本声明,保持本文完整,并以超链接形式注明作者Leslie Tien和本文原始地址:
https://leslietien.blogspot.com/2018/12/blog-post_7.html

Friday, September 28, 2018

HashMap与TreeMap有什么区别?

先说相同点:
都实现了Map接口。
HashMap、TreeMap都是非线程安全的。顺便提一下HashTable,它是线程安全的,全,它支持线程的同步,即任一时刻只有一个线程能写Hashtable,然而,这也导致了Hashtable在写入时会比较慢。

不同点:
在性能上,HashMap:适用于在Map中插入、删除和定位元素。TreeMap:适用于按自然顺序或自定义顺序遍历键(key)。 TreeMap能够把它保存的记录根据键排序,默认是按升序排序,也可以指定排序的比较器。当用Iteraor遍历TreeMap时,得到的记录是排过序的。
TreeMap的键和值都不能为空。HashMap最多只允许一条记录的键为Null;允许多条记录的值为 Null。
看一个例子:

package test;

import java.util.Map;
import java.util.TreeMap;

public class TreeMapTest {
      public static void main(String[] args) {
        Map tree = new TreeMap();
        int [] a={9,8,7,6,5,4,3,2,1,0};
        for(int i=0; i<10 i<10;i++){
            tree.put(a[i],i );
        }
        for(Integer key:tree.keySet()){
            System.out.print(tree.get(key) + " ");
        }
     }
}
输出结果是:

9 8 7 6 5 4 3 2 1 0
可以发现,TreeMap把它保存的记录按照键进行了排序,并且是按升序排序。
版权声明
本博客所有的原创文章,作者皆保留版权。转载必须包含本声明,保持本文完整,并以超链接形式注明作者Leslie Tien和本文原始地址:
https://leslietien.blogspot.com/2018/12/hashmaptreemap.html

Monday, September 24, 2018

java基本原则

java设计模式中应当遵循的基本原则:

<单一职责原则>我们把职责定义为系统变化的原因。所以在定义类,接口,方法的时候,如果有多余一个的动机去改变这个类,接口,方法,那么说明定义的类,接口,方法多余一个职责。单一职责原则宗旨是每个接口、类的功能,只能用来做专门的事,做到功能单一。

<开放封闭原则>一个模块、类、方法在扩展性方面应该是开放的而在更改性方面应该是封闭的。 开放封闭原则体现在若要在已有系统基础上进行需求拓展时,通过添加新类或者新代码来实现,对已有代码做到最少修改,甚至是零修改。这就要求开发人员对程序中频繁变化的地方进行抽象,即对变化的修改关闭。对于变化的不确定性,可通过继承的使用,抽象类的运用来随时扩展。

<里氏替换原则>保证子类可以替换它的父类。对于一组具有类似属性,方法,变量的类。我们可以提取公共属性,方法,变量做为一个基类(抽象类或者类),使这一组类继承基类,重写虚方法。现在这些继承的类和基类的关系符合替换原则。

<依赖倒置原则>面向接口编程,依赖于抽象而不依赖于具体。通过接口或者抽象类提供依赖关系。写代码时用到具体类时,不与具体类交互,而与具体类的上层接口交互。

<接口分离原则>模块间要通过抽象接口隔离开,而不是通过具体的类强耦合起来。

<迪米特原则>又叫最少知识原则; 对象与对象之间应该使用尽可能少的方法来关联,避免千丝万缕的关系;  低耦合; 类知道其他类应尽量少; 类可以访问其他类的方法或者属性也应尽量少。

       总之,六大设计原则是代码设计的基本原则。设计原则规范了开发人员如何去设计和实现代码,来提高程序的规范性、可读性、扩展性和维护性。
      更多参考资料:
版权声明
本博客所有的原创文章,作者皆保留版权。转载必须包含本声明,保持本文完整,并以超链接形式注明作者Leslie Tien和本文原始地址:
https://leslietien.blogspot.com/2018/12/java_6.html

Saturday, September 22, 2018

JDK的bin目录下都有哪些内容?


这是java的JDK的bin目录下的一部分,可以看到有很多*.exe,他们都是开发工具执行文件。这些工具是JDK的基础,用这些工具来编写应用程序。平时我们用不到这么多,在这里简单归纳整理一些常见的exe文件的用途:
  1. javac.exe:Java编译器,将Java源代码换成字节代码,即.class文件。在DOS命令行编译java文件会用到此命令。
  2. java.exe:这个应该是最熟悉的了,Java解释器,应用程序启动器。直接从类文件执行Java应用程序代码 。
  3. javadoc.exe:根据Java源代码及其说明语句生成的HTML文档。
  4. jdb.exe:Java调试器,可以逐行地执行程序、设置断点和检查变量。
  5. jar.exe:多用途的存档及压缩工具,是个java应用程序,可将多个文件合并为单个JAR归档文件。
  6. javap.exe:Java反汇编器,显示编译类文件中的可访问功能和数据,同时显示字节代码含义。
  7. javah.exe:头文件生成器,javah程序创建C头文件和存根文件,这些是把本地C成员函数包入java 所需要的。被创建的头文件给出了有关java类的信息,这些信息是C成员函数与java类交换数据所必需的。存根文件将用来创建将定义java对象的结构与java对象本身数据相联系的C文件。
  8. extcheck.exe:扩展检测工具,主要用于检测指定jar文件与当前已安装的Java SDK扩展之间是否存在版本冲突。
  9. javaw.exe:Java运行工具,用于运行.class字节码文件或.jar文件,但不会显示控制台输出信息,适用于运行图形化程序。
  10. javaws.exe:Java Web Start,使您可以从Web下载和运行Java应用程序,下载、安装、运行、更新Java应用程序都非常简单方便。
  11. jcmd.exe:Java 命令行(Java Command),用于向正在运行的JVM发送诊断命令请求。
  12. jconsole.exe:图形化用户界面的监测工具,主要用于监测并显示运行于Java平台上的应用程序的性能和资源占用等信息。
如有纰漏,请不吝赐教,谢谢!
版权声明
本博客所有的原创文章,作者皆保留版权。转载必须包含本声明,保持本文完整,并以超链接形式注明作者Leslie Tien和本文原始地址:
https://leslietien.blogspot.com/2018/12/jdkbin.html

Wednesday, September 5, 2018

排序算法

常用排序算法归纳
评价排序算法好坏的标准:
1.执行时间和所需的辅助空间。
2.算法本身的复杂程度。

排序稳定性时间复杂度空间复杂度
气泡排序(bubble sort)稳定最差、平均为O(n²),最好为O(n)1
插入排序(insertion sort)稳定最差、平均为O(n²),最好为O(n)1
归并排序(merge sort)稳定最差、平均和最好都是O(nlog n)O(n)
二叉树排序(Binary tree sort)稳定O(nlog n)O(n)
选择排序(selection sort)不稳定最差、平均都是O(n²)1
堆排序(heapsort)不稳定最差、平均和最好都是O(nlog n)1
快速排序(quicksort)不稳定平均是O(n log n),最坏情况O(n²)O(log n)
版权声明
本博客所有的原创文章,作者皆保留版权。转载必须包含本声明,保持本文完整,并以超链接形式注明作者Leslie Tien和本文原始地址:
https://leslietien.blogspot.com/2018/12/blog-post.html